20230807_deadlock

ꡐ착 μƒνƒœλž€? λ‚˜λ¬΄μœ„ν‚€μ—μ„œ μ•Œλ €μ£ΌκΈΈ, "두 개 μ΄μƒμ˜ μž‘μ—…μ΄ μ„œλ‘œ μƒλŒ€λ°©μ˜ μž‘μ—…μ΄ λλ‚˜κΈ° λ§Œμ„ 기닀리고 있기 λ•Œλ¬Έμ— μ–΄λ–»κ²Œλ“  결둠이 λ‚˜μ§€ μ•ŠλŠ” μƒνƒœ"λ₯Ό μ˜λ―Έν•œλ‹€ ν•΄λ‹Ή 상황이 λ°œμƒν•  수 μžˆλŠ” 상황은 μ•„λž˜μ™€ κ°™λ‹€

  • 비선점 > 지원을 μ„ μ ν•˜μ§€ μ•ŠμŒ

  • ν™˜ν˜•λŒ€κΈ° > μ›ν˜•μœΌλ‘œ μžμ›μ„ λŒ€κΈ° 쀑

  • μƒν˜Έλ°°μ œ > μžμ›μ€ ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€λ§Œ 점유 κ°€λŠ₯

  • μ μœ λŒ€κΈ° > μžμ›μ— 고유번호 ν• λ‹Ή ν›„ μˆœμ„œλŒ€λ‘œ μžμ›

μ΄λ ‡κ²Œ λ””λΉ„μ—μ„œ νŠΈλžœμž­μ…˜(μž‘μ—… λ‹¨μœ„)κ°€ κ΅μ°©μƒνƒœλ‘œ λ˜μ–΄μžˆλŠ” μƒν™©μ—μ„œ μ˜€λΌν΄μ€ κ΅μ°©μƒνƒœμΈ 상황을 ν™•μΈν•˜κ³ , 였라클이 μœ„μ˜ ORA-00060 을 λ±‰μœΌλ©΄μ„œ κ΅μ°©μƒνƒœλ₯Ό ν’€μ–΄μ£Όκ²Œ λœλ‹€ λ°±μ—”λ“œ μ„œλ²„μ—μ„œ λ°œμƒν•˜λŠ” κ΅μ°©μƒνƒœλ©΄ μ—­μ‹œ 디비에 κ±Έλ €μžˆλŠ” 락과 κ΄€λ ¨μžˆμ„ 것이라고 μ˜ˆμƒμ„ ν–ˆκ³  λ””λΉ„μ—μ„œ 락은 κ±°λŠ” μΌ€μ΄μŠ€λŠ” 크게 2가지가 μžˆλŠ” κ²ƒμœΌλ‘œ μ•Œκ³  μžˆλ‹€ @Lock 을 ν†΅ν•΄μ„œ 쑰회 μ‹œ, for update 문을 λ‚ λ¦¬λŠ” μΌ€μ΄μŠ€ / νŠΉμ • λ‘œμš°μ— λŒ€ν•œ update 문이 λ‚ λΌκ°€λŠ” μΌ€μ΄μŠ€

μš°μ„  μ΄λ²ˆμ— ν•΄λ‹Ή μ΄μŠˆκ°€ λ°œμƒν•œ ν”„λ‘œμ νŠΈμ—μ„œλŠ” @Lock 을 ν†΅ν•΄μ„œ 락을 κ±Έκ³  μ²˜λ¦¬ν•˜λŠ” 방식은 λ³„λ‘œ λ§Žμ§€ μ•Šμ•˜κΈ°μ— κ·Έλ ‡κ²Œ μ—„μ²­ μ˜μ‹¬κ°€λŠ”κ²Œ μžˆμ§€λŠ” μ•Šμ•˜λ‹€ κ·Έλ ‡κ²Œ ν™•μΈν•΄λ³΄λ‹ˆ @Lock 을 ν†΅ν•΄μ„œ λ‚˜κ°€λŠ” 사항 μžμ²΄λŠ” λ”°λ‘œ μ—†μ—ˆλ‹€ λ‹€μŒμœΌλ‘œλŠ” 그럼 ν•΄λ‹Ή μ—λŸ¬κ°€ λ°œμƒν•œ μ‹œμ μ— λŒμ•„κ°€κ³  μžˆλŠ” νŠΈλžœμž­μ…˜λ“€μ„ μ­‰ ν™•μΈν–ˆλ‹€ μ •ν™•ν•˜κ²ŒλŠ” μ—λŸ¬κ°€ λ°œμƒν•œ λ‘œμ§μ—μ„œ 디비에 insert/update μΉ˜λŠ” 것듀이 μžˆλŠ”μ§€ 확인, νŠΈλžœμž­μ…˜ μ•ˆμ—μ„œ μ–Έμ œ ν•΄λ‹Ή 쿼리가 디비에 λ‚ μ•„κ°€λŠ”μ§€ ν™•μΈν–ˆλ‹€ 그리고 디비에 update, insert 문이 λ‚ μ•„κ°€λŠ” μΌ€μ΄μŠ€μ—μ„œ μ–΄λ–»κ²Œ κ΅μ°©μƒνƒœκ°€ μƒμ„±λ˜μ—ˆλŠ”μ§€ κ³ λ―Όν•΄λ΄€λ‹€ <br

μ˜ˆμƒμ΄ κ°€λŠ” 두 가지 μΌ€μ΄μŠ€λŠ” 이와 κ°™λ‹€ 두 νŠΈλžœμž­μ…˜μ΄ μ„œλ‘œ ν•˜λ‚˜μ˜ 둜우λ₯Ό μ—…λ°μ΄νŠΈν•˜κΈ° μœ„ν•΄μ„œ 각각이 락을 μž‘μ€ μƒν•­μ—μ„œ μΆ”κ°€μ μœΌλ‘œ ν•΄λ‹Ή λ‘œμš°μ— 락을 μž‘μœΌλ €λŠ” 쿼리가 λ“€μ–΄μ˜€λŠ” μΌ€μ΄μŠ€ 두 νŠΈλžœμž­μ…˜μ΄ 둜우 A, B λ₯Ό μˆœν™˜μ μœΌλ‘œ 락을 작고 μžˆλŠ” 상황 - T1μ—μ„œ Aλ₯Ό λ¨Όμ € κ±Έκ³ , T2μ—μ„œ Bλ₯Ό λ¨Όμ € κ±Έκ³ , T1μ—μ„œ Bλ₯Ό κ±Έλ €κ³ ν•˜κ³ , T2μ—μ„œ Aλ₯Ό κ±Έλ €λŠ” μΌ€μ΄μŠ€ >κ΅μ°©μƒνƒœλ₯Ό μ„œλ²„ λ‘œκ·Έλ‹¨μ—μ„œ ν™•μΈν•˜κΈ° μœ„ν•΄μ„œλŠ” deadlock 이 λ°œμƒν•˜κ²Œλœ νŠΉμ • 둜우λ₯Ό μ°Ύκ³  > ν•΄λ‹Ή 둜우λ₯Ό μ—…λ°μ΄νŠΈν•˜λŠ” 쿼리듀과 κ·Έ νŠΈλžœμž­μ…˜μ˜ λ²”μœ„λ₯Ό ꡬ체화 μ°Ύκ³  > μ‹€μ œ 둜그λ₯Ό 봀을 λ•Œ μ–΄λŠ μ‹œμ μ— 쿼리가 μ„œλ²„λ‘œλΆ€ν„° λ””λΉ„λ‘œ λ‚ μ•„κ°”λŠ”μ§€ 확인 μ„œλ²„μ˜ 둜그λ₯Ό 기반으둜 ν•΄λ‹Ή νŠΈλžœμž­μ…˜μ˜ μˆœμ„œλ₯Ό κ·Έλ €κ°€λ³΄λ©΄μ„œ μ–΄λ–€ κ΅μ°©μƒνƒœμΈμ§€μ— λŒ€ν•΄μ„œ νŒŒμ•…μ΄ ν•„μš”ν–ˆλ‹€

상황은 μ΄λŸ¬ν–ˆλ‹€ μ‚¬μš©μžλ³„λ‘œ νŠΉμ • λ¦¬μ›Œλ“œμ˜ 지급 갯수λ₯Ό ν†΅κ³„λ‘œμ¨ μ €μž₯ν•˜λŠ” 경우인데, νŠΉμ • μ΄λ²€νŠΈμ— μ—°κ²°λ˜μ–΄ μžˆλŠ” λ¦¬μ›Œλ“œλ₯Ό κ°€μ Έμ˜€λŠ” κ³Όμ •μ—μ„œ 같은 λ¦¬μ›Œλ“œλ“€μ„ κ°€μ Έμ˜€λŠ”λ°, μ΄λ²€νŠΈκ°€ λ™μ‹œμ— λ“€μ–΄μ˜¨ μƒν™©μ—μ„œ 두 μ΄λ²€νŠΈκ°€ λ¦¬μ›Œλ“€λ₯΄ κ°€μ Έμ˜¬ λ–„ λ™μΌν•œ μˆœμ„œλ₯Ό 보μž₯ν•΄μ„œ λ“€μ–΄μ˜€λŠ” μΌ€μ΄μŠ€κ°€ μ•„λ‹ˆλΌ λ‘˜ λ‹€ μˆœμ„œλ₯Ό 자기 λ©‹λŒ€λ‘œ μ„€μ •ν•΄μ„œ λ¦¬μ›Œλ“œλ³„λ‘œ 둜직이 λŒμ•„κ°€κΈ° 떄문에 κ΅μ°©μƒνƒœμ˜ 두 번째 상황이 λ°œμƒν•œ 것이닀

μ΄κ²ƒμ˜ ν•΄κ²°λ°©μ•ˆμœΌλ‘œλŠ” μš°μ„  μˆœμ„œλ₯Ό 보μž₯ν•˜λŠ”κ²Œ κ°€μž₯ 쒋을 것이라고 생각이 λ“€μ—ˆλ‹€, 그런데 μˆœμ„œλ₯Ό 보μž₯ν•˜λŠ” 방법에 λŒ€ν•΄μ„œ κ³ λ―Όν•΄λ³΄μžλ‹ˆ, MQλ₯Ό μ‚¬μš©ν•΄μ„œ μˆœμ„œλ₯Ό 보μž₯μ‹œν‚€λŠ” 방법이 μžˆλ‹€κ³  μƒκ°ν–ˆλ‹€ 그런데 κ·Έλ ‡κ²Œ ν•˜κΈ°μ—λŠ” λ„ˆλ¬΄ λ§Žμ€ μ½”λ“œλ₯Ό λ“€μ–΄ μ—Žμ–΄μ•Ό ν•˜λŠ” μ΄μŠˆκ°€ μžˆκΈ°μ— κ·Έλƒ₯ 방법 쀑 ν•˜λ‚˜λΌκ³ λ§Œ μΈμ§€ν•˜κ³  λ„˜μ–΄κ°€λ €κ³  ν•œλ‹€

μ΄λ²ˆμ— μ μš©ν•œ 방법은 κ·Έλž˜μ„œ 락의 λ²”μœ„λ₯Ό λŠ˜λ €μ£ΌλŠ” λ°©μ‹μœΌλ‘œ μ²˜λ¦¬ν–ˆλ‹€ κ΅μ°©μƒνƒœκ°€ λ°œμƒν•œ 원인은 2개의 νŠΈλžœμž­μ…˜μ—μ„œ μˆœν™˜μ μœΌλ‘œ 2개의 둜우λ₯Ό μ—…λ°μ΄νŠΈν•˜λ €κ³  ν•˜κΈ°μ— λ°œμƒν•œ 상황이라고 ν–ˆλŠ”λ° ν•΄λ‹Ή 상황은 두 νŠΈλžœμž­μ…˜μ΄ 거의 λ™μ‹œμ—(0.094μ΄ˆμΈκ°€..)에 같이 μ»€λ°‹λ˜μ—ˆκ³  μ—…λ°μ΄νŠΈ μΉ˜λŠ” μˆœκ°„μ— 락이 μž‘ν˜€μ„œ λ¬Έμ œμ˜€μœΌλ‹ˆ, select for update 문을 ν†΅ν•΄μ„œ 락의 μ‹œκ°„μ„ 길게 늘렀주고, νŠΈλžœμž­μ…˜μ„ λΆ„λ¦¬ν•¨μœΌλ‘œμ¨ μ²˜λ¦¬ν•˜λ €κ³  ν–ˆλ‹€

μ΄λ ‡κ²Œ κΉŒμ§€ν•΄μ£Όλ©΄ μš°λ €ν•˜κ³  μžˆμ—ˆλ˜ κ΅μ°©μƒνƒœμ— λŒ€ν•œ μ²˜λ¦¬λŠ” ν•΄μ†Œλ˜λŠ” 것을 ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό ν†΅ν•΄μ„œ ν™•μΈν–ˆλŠ”λ° 좔가적인 λ¬Έμ œκ°€ μžˆμ—ˆλ‹€ >> μ΄μŠˆλŠ” νŠΈλžœμž­μ…˜μ„ λΆ„λ¦¬ν•˜λ©΄μ„œ λ°œμƒν•œ 이슈인데, 기쑴에 ν…ŒμŠ€νŠΈ μ½”λ“œ μ€‘μ—μ„œ 톡계 둜직이 μˆ˜ν–‰λ˜κ³  λ‚˜μ„œ ν•΄λ‹Ή 톡계 데이터λ₯Ό μ‚¬μš©ν•˜λŠ” 뢀뢄을 κ²€μ¦ν•˜λŠ” μ½”λ“œκ°€ μžˆμ—ˆλ‹€ μˆ˜μ •λœ μ‚¬ν•­μœΌλ‘œλŠ” νŠΈλžœμž­μ…˜μ„ REQUIRES_NEW 을 ν†΅ν•΄μ„œ μ²˜λ¦¬ν•΄λ‘” 상황이고, 루프λ₯Ό λ„λŠ” μƒν™©μ—μ„œ 전에 μ‘°νšŒν•΄λ‘μ—ˆλ˜(μƒˆλ‘œμš΄ νŠΈλžœμž­μ…˜μ—μ„œ μ—…λ°μ΄νŠΈμΉœ 둜우)λ₯Ό λ””λΉ„λ‘œλΆ€ν„° μ‘°νšŒν•΄μ™€μ„œ μ‚¬μš©ν•˜λŠ” 것이 μ•„λ‹ˆλΌ jpa μ—μ„œ μ œκ³΅ν•΄μ£ΌλŠ” 캐싱을 ν†΅ν•΄μ„œ μ²˜λ¦¬ν•œλ‹€λŠ” 점이닀 μ‹€μ œλ‘œ jpa μ—μ„œ μš°λ¦¬κ°€ ν”νžˆ μ•Œκ³  μžˆλŠ” μ˜μ†μ„± μ»¨ν…μŠ€νŠΈλŠ” 각 νŠΈλžœμž­μ…˜ λ³„λ‘œ μƒμ„±λ˜κ³  κ΄€λ¦¬λœλ‹€ > νŠΉμ • 둜우λ₯Ό νŠΈλžœμž­μ…˜ Aμ—μ„œ λ¨Όμ € μ‘°νšŒν•΄λ‘” λ‹€μŒ, ν•΄λ‹Ή 둜우λ₯Ό Bμ—μ„œ μˆ˜μ •ν•œλ‹€κ³  ν•΄μ„œ νŠΈλžœμž­μ…˜ AλŠ” νŠΈλžœμž­μ…˜ Bμ—μ„œμ˜ μˆ˜μ •μ‚¬ν•­μ„ λ°”λ‘œ μ—…λ°μ΄νŠΈλ˜μ–΄ 가지고 μžˆμ§€ μ•ŠλŠ”λ‹€λŠ” κ²ƒμ΄μ˜€λ‹€ λ§Œμ•½μ— ν•΄λ‹Ή μΌ€μ΄μŠ€ 같은 κ²½μš°μ—λŠ” 뭐 방법은 λͺ‡ 가지가 μ‘΄μž¬ν•  것이닀 νŠΈλžœμž­μ…˜μ΄ λΆ„λ¦¬λ˜μ–΄μ„œ 둜직이 λŒμ•„κ°€λŠ” μΌ€μ΄μŠ€μ—λŠ” ν•΄λ‹Ή 둜우λ₯Ό μ‘°νšŒν•  λ•Œ λ„€μ΄ν‹°λΈŒ 쿼리λ₯Ό ν†΅ν•΄μ„œ μ²˜λ¦¬ν•œλ‹€λ˜κ°€, μƒˆλ‘œμš΄ νŠΈλžœμž­μ…˜μ—μ„œ μ²˜λ¦¬ν•œ 값을 λ¦¬ν„΄ν•˜μ—¬ λΆ€λͺ¨ νŠΈλžœμž­μ…˜μ—μ„œλ„ λ³€κ²½λœ 값을 λΆ€λͺ¨μ—μ„œλ„ μ €μž₯ν•΄μ„œ μ˜μ†μ„±μ— λ„£μ–΄μ£ΌλŠ” 방법 이제 μ–΄λ–€ 방식을 가지고 μ§„ν–‰ν• κΉŒ κ³ λ―Όν•˜λŠ” 도쀑에 ν™•μΈν•΄λ³΄λ‹ˆ 사싀 λ‘œμ§μ—μ„œλŠ” κ·Έλ ‡κ²Œ ν†΅κ³„μΉ˜λ₯Ό μŒ“μ€ λΆ€λΆ„μ˜ 데이터λ₯Ό λΆ€λͺ¨ νŠΈλžœμž­μ…˜μ—μ„œ μ‚¬μš©ν•˜λŠ” μΌ€μ΄μŠ€κ°€ 있던 것은 μ•„λ‹ˆμ˜€λ‹€..! μ‹€μ œ λ‘œμ§μ„ 계속 듀여닀봐도 λ­”κ°€ μ΄μƒν•΄μ„œ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό λ΄λ³΄λ‹ˆ.. μ˜›λ‚ μ— ν…ŒμŠ€νŠΈμ½”λ“œ μœ„μ—λ‹€κ°€ @Transactional 을 λΆ™ν˜€λ†”μ„œ ν…ŒμŠ€νŠΈ μ½”λ“œ μžμ²΄κ°€ λ¬Άμ—¬μ„œ λ™μž‘ν•˜κ³  μžˆμ—ˆλ˜ 것이닀 κ·Έλž˜μ„œ 자꾸 μ—…λ°μ΄νŠΈλ˜μ§€ μ•Šμ€ 값을 가지고 검증을 μ§„ν–‰ν•˜λ‹ˆ μ—λŸ¬κ°€ λ‚ μˆ˜λ°–μ—.. κ²°λ‘ μœΌλ‘œλŠ” κ·Έλž˜μ„œ ν•˜λ‚˜ λ°°μ› λ‹€ μƒκ°ν•˜κ³  @Transactional 으둜 λ¬Άμ—¬μžˆλŠ” ν…ŒμŠ€νŠΈμ½”λ“œλ₯Ό λΆ„λ¦¬ν•˜λŠ” μž‘μ—…μ„ μ§„ν–‰ν–ˆμ—ˆλ‹€

λŠλ‚€μ .. λ°±μ—”λ“œ 개발자둜써 이제 λ¬Έμ œμ‚¬ν•­λ“€μ„ ν•˜λ‚˜ν•˜λ‚˜ νŒŒμ•…ν•˜κ³  μ²˜λ¦¬ν•΄κ°€λŠ” 과정을 κ²ͺλŠ”λ° μ—¬μ „νžˆ 곡뢀가 많이 ν•„μš”ν•˜κ³ , λ‚΄κ°€ μ•Œκ³  μžˆμ—ˆλ‹€κ³  μƒκ°ν•œ 것듀이 100%κ°€ μ•„λ‹Œ μΌ€μ΄μŠ€λ„ μžˆλ”λΌ.. λ§Žμ€ 선인듀과 λ‹€λ₯Έ κ°œλ°œμžλ“€κ³Όλ„ μ΄μŠˆμ— λŒ€ν•΄μ„œ κ³΅μœ ν•˜κ³  μ„œλ‘œμ˜ 지식을 κ³΅μœ ν•˜λ©° 더 λ‚˜μ€ λ°©ν–₯을 μœ„ν•΄μ„œ κ³ λ―Όν•˜λŠ” 것도 ꡉμž₯이 μ€‘μš”ν•˜λ‹€κ³  생각이 λ“ λ‹€

Last updated

Was this helpful?