πŸ›  ν•΄κ²° 방법: 비관적 락(Pessimistic Lock) λ„μž…

 

비관적 락 λ„μž…

πŸ” 문제 ν•΄κ²° λ°©ν–₯

  1. νŠΈλžœμž­μ…˜ (@Transactional) 으둜 μ†‘κΈˆ λ‹¨μœ„ μž‘μ—…μ„ ν•˜λ‚˜μ˜ 논리적 처리 λ‹¨μœ„λ‘œ λ¬Άμ—ˆκ³ 
  2. SELECT ... FOR UPDATE (비관적 락) 을 톡해
    같은 μ†‘μ‹ μž κ³„μ’Œμ— μ—¬λŸ¬ μ“°λ ˆλ“œκ°€ λ™μ‹œμ— μ ‘κ·Όν•  λ•Œ 락을 κ±Έμ–΄μ„œ μΆ©λŒμ„ λ°©μ§€ν–ˆμ–΄.
  3. ν…ŒμŠ€νŠΈμ—μ„œλ„ 10개의 μ†‘κΈˆ μš”μ²­μ„ λ™μ‹œμ— 날렸을 λ•Œλ„
    • 데이터 정합성이 κΉ¨μ§€μ§€ μ•Šμ•˜κ³ 
    • λ°λ“œλ½λ„ μ•ˆ 생기고
    • μ†‘μ‹ μž μž”κ³ : 500 / μˆ˜μ‹ μž μž”κ³ : 500 으둜 μ •ν™•ν•˜κ²Œ μ²˜λ¦¬λμ–΄.

πŸ”’ 비관적 락 적용 흐름

    1. @Lock(LockModeType.PESSIMISTIC_WRITE)λ₯Ό 톡해 μ†‘μ‹ μž, μˆ˜μ‹ μž κ³„μ’Œ row에 락을 건닀.
    2. νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ 포인트 차감 및 적립을 μˆ˜ν–‰ν•œλ‹€.
    3. νŠΈλžœμž­μ…˜μ΄ λλ‚˜λ©΄ 락이 ν•΄μ œλœλ‹€.

πŸ’‘ λ„μž… ν›„ κ°œμ„ μ 

 

ν•­λͺ© Before After
데이터 μ •ν•©μ„± 좩돌 및 λ°λ“œλ½ λ°œμƒ μ•ˆμ •μ  처리
μ—λŸ¬ λ°œμƒλ₯  Deadlock, NoSuchElementException μ—†μŒ
λ™μ‹œμ„± 처리 μ „λž΅ λ―ΈλΉ„ λͺ…μ‹œμ  비관적 락 λ„μž…

πŸ‘€ κ·Έλž˜μ„œ 이건 어디에 쓰이냐?

  • 포인트 μ†‘κΈˆ / 은행 κ³„μ’Œ μž”κ³  / 재고 차감 / 쿠폰 μ‚¬μš© λ“±
  • “ν•˜λ‚˜λ§Œ μžˆμ–΄μ•Ό ν•˜λŠ” μžμ›”을 μ‹€μ‹œκ°„μœΌλ‘œ μ •ν™•ν•˜κ²Œ μ²˜λ¦¬ν•΄μ•Ό ν•  λ•Œ λ§€μš° μ€‘μš”ν•΄

 

πŸ“Œ μΆ”ν›„ κ³„νš

  • νŠΈλž˜ν”½ 증가 μ‹œ 낙관적 락 + μž¬μ‹œλ„λ‘œ μ „ν™˜ κ³ λ €
  • 이벀트 기반 처리 λ„μž…: Kafka + Redis Lock μ‘°ν•© 섀계
  • 쑰회 μ„±λŠ₯ ν–₯상을 μœ„ν•œ CQRS ꡬ쑰 뢄리

+ Recent posts