Tech Stack/Database

[DB] [λ™μ‹œμ„±μ œμ–΄] 낙관적 락과 비관적 락

_silver 2025. 9. 16. 18:01

 

 

 

κ²Œμ‹œκΈ€(Post), λŒ“κΈ€(Comment) μ’‹μ•„μš” κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κΈ°μ— μ•žμ„œ 

데이터 λ² μ΄μŠ€μ— μ ‘κ·Όν•΄μ„œ μ‚¬μš©μžκ°€ μ’‹μ•„μš”λ₯Ό λ™μ‹œμ— λˆ„λ₯΄λŠ” 경우 좩돌이 λ°œμƒν•˜κ²Œ λœλ‹€.

좩돌이 λ°œμƒ μ•ˆν•˜λ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒ

 

방법은 λ°μ΄ν„°λ² μ΄μŠ€μ˜ 락(Lock)을 μ‚¬μš©ν•˜μ—¬ μΆ©λŒμ„ λ°©μ§€ν•˜λŠ” 방법과 Redisλ₯Ό μ‚¬μš©ν•˜λŠ” 방법이 μžˆλŠ”λ°

λ°μ΄ν„°λ² μ΄μŠ€μ˜ 락(Lock)이 무엇인지 λ¨Όμ € μ•Œμ•„ 보렀고 ν•œλ‹€.

 

μ΄λŸ¬ν•œ λ™μ‹œμ„± λ¬Έμ œλŠ” λ°μ΄ν„°μ˜ 일관성과 무결성을 μœ„ν˜‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ λ™μ‹œμ— 데이터에 μ ‘κ·Όν•˜λ €λŠ” λ‹€μ–‘ν•œ μš”μ²­λ“€μ„ 잘 μ œμ–΄ν•˜λŠ” 것은 ν•„μˆ˜μ μΈ μž‘μ—…μž…λ‹ˆλ‹€. λ™μ‹œμ„± μ œμ–΄λ₯Ό μœ„ν•œ 두 κ°€μ§€ 핡심적인 방법에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

 


비관적 락(pessimistic lock)

비관적 락은 κ°„λ‹¨ν•˜κ²Œ λ§ν•˜λ©΄ 데이터λ₯Ό μˆ˜μ •ν•˜κΈ° 전에 ν•΄λ‹Ή 데이터에 λŒ€ν•œ 접근을 미리 μ œν•œν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. 데이터λ₯Ό μš”μ²­ν•  λ•Œ λ™μ‹œμ„± λ¬Έμ œκ°€ λ°œμƒν•  것이라고 μ˜ˆμƒν•˜κ³  락을 κ±°λŠ” λ°©λ²•μž…λ‹ˆλ‹€. ν•œ λ²ˆμ— κ°™μ€ 데이터에 접근을 λͺ»ν•˜κ²Œ ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. μ΄λ ‡κ²Œ λ™μ‹œμ— 같은 데이터 접근을 λ§‰λŠ”λ‹€λ©΄ μ—¬λŸ¬ λ°μ΄ν„°μ˜ μΆ©λŒμ„ 막을 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

 


낙관적 락(optimistic lock)

낙관적 락은 λŒ€λΆ€λΆ„μ˜ νŠΈλžœμž­μ…˜μ΄ 좩돌이 λ°œμƒν•˜μ§€ μ•Šμ„ 거라고 λ‚™κ΄€μ μœΌλ‘œ κ°€μ •ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ—¬λŸ¬ νŠΈλžœμž­μ…˜μ΄ λ™μ‹œμ— 데이터에 μ ‘κ·Όν•  수 μžˆλ„λ‘ ν—ˆμš©ν•΄ μ€λ‹ˆλ‹€. λ”°λΌμ„œ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ œκ³΅λ˜λŠ” 락 κΈ°λŠ₯을 μ‚¬μš©ν•˜μ§€ μ•Šκ³  μ—”ν‹°ν‹°μ˜ 버전을 톡해 λ™μ‹œμ„±μ„ μ œμ–΄ν•©λ‹ˆλ‹€. μžμ›μ— λŒ€ν•΄ 미리 락을 κ±Έμ§€ μ•Šκ³  좩돌이 λ°œμƒν•˜λ©΄ κ·Έλ•Œ μ²˜λ¦¬ν•˜λ„λ‘ λ™μ‹œμ„±μ„ μ œμ–΄ν•©λ‹ˆλ‹€.

 

낙관적 락은 DBκ°€ μ•„λ‹ˆλΌ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‹¨μ—μ„œ 처리 ν•©λ‹ˆλ‹€. 데이터λ₯Ό 읽은 후에 데이터λ₯Ό update ν•˜λŠ” κ³Όμ •μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ—μ„œ 이미 데이터λ₯Ό update ν•˜κ³  버전을 λ³€κ²½ν–ˆλ‹€λŠ” 말이기 λ•Œλ¬Έμž…λ‹ˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ˜ˆμ™Έκ°€ λ°œμƒν•œ μž‘μ—…μ€ 둀백을 톡해 μΆ©λŒμ„ ν•΄κ²°ν•΄μ•Ό ν•©λ‹ˆλ‹€.

 

 

μœ„ flowλ₯Ό ν†΅ν•΄μ„œ κ°™μ€ row에 λŒ€ν•΄μ„œ 각기 λ‹€λ₯Έ 2개의 μˆ˜μ • μš”μ²­μ΄ μžˆμ—ˆμ§€λ§Œ 1κ°œκ°€ μ—…λ°μ΄νŠΈ 됨에 따라 version이 λ³€κ²½λ˜μ—ˆκΈ° λ•Œλ¬Έμ— λ’€μ˜ μˆ˜μ • μš”μ²­μ€ λ°˜μ˜λ˜μ§€ μ•Šκ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ 낙관적락은 versionκ³Ό 같은 λ³„λ„μ˜ μ»¬λŸΌμ„ μΆ”κ°€ν•˜μ—¬ 좩돌적인 μ—…λ°μ΄νŠΈλ₯Ό λ§‰μŠ΅λ‹ˆλ‹€. version 뿐만 μ•„λ‹ˆλΌ hashcode λ˜λŠ” timestampλ₯Ό μ΄μš©ν•˜κΈ°λ„ ν•©λ‹ˆλ‹€.

낙관적 락은 version λ“±μ˜ ꡬ뢄 μ»¬λŸΌμ„ μ΄μš©ν•΄μ„œ μΆ©λŒμ„ μ˜ˆλ°©ν•©λ‹ˆλ‹€.

 

낙관적 락은 데이터λ₯Ό μ—…λ°μ΄νŠΈ ν•˜κΈ° μ „μ˜ 쑰회(select) ν•˜λ©΄μ„œ Lock을 κ±°λŠ” μž‘μ—…μ΄ ν•„μš”μ—†μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ μ„±λŠ₯적으둜 비관적 락보닀 더 μ’‹μŠ΅λ‹ˆλ‹€ κ·Έλ¦¬κ³  λ‚™κ΄€μ  락은 νŠΈλžœμž­μ…˜μ„ ν•„μš”λ‘œ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ΄ 두가지가 비관적 락에 λΉ„ν•΄ κ°€μ§€λŠ” 낙관적 락의 μ΅œλŒ€ κ°•μ μž…λ‹ˆλ‹€.

 

 

ν•˜μ§€λ§Œ 낙관적 락의 μ΅œλŒ€ 단점은 λ‘€λ°±μž…λ‹ˆλ‹€. λ§Œμ•½ μΆ©λŒμ΄ 났닀고 ν•œλ‹€λ©΄ 이λ₯Ό ν•΄κ²°ν•˜λ €λ©΄ κ°œλ°œμžκ°€ μˆ˜λ™μœΌλ‘œ 둀백처리λ₯Ό ν•œλ•€ν•œλ•€ ν•΄μ€˜μ•Όν•©λ‹ˆλ‹€. λΉ„관적 락이라면 νŠΈλžœμž­μ…˜μ„ λ‘€λ°±ν•˜λ©΄ λλ‚˜λŠ” μž‘μ—…μ΄μ§€λ§Œ 낙관적 락은 κ·Έλ ‡μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μˆ˜λ™μœΌλ‘œ λ‘€λ°±μ²˜λ¦¬λŠ” κ΅¬ν˜„ν•˜κΈ°λ„ κΉŒλ‹€λ‘­μ§€λ§Œ μ„±λŠ₯적으둜 보더라도 updateλ₯Ό ν•œλ²ˆμ”© 더 ν•΄μ€˜μ•Όν•©λ‹ˆλ‹€. λ”°λΌμ„œ 결과적으둜 비관적 락 보닀 μ’‹μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 단점 λ•Œλ¬Έμ— λ‚™κ΄€μ  락은 좩돌이 많이 μ˜ˆμƒλ˜κ±°λ‚˜ 좩돌이 λ°œμƒν–ˆμ„ λ•Œ λΉ„μš©μ΄ 많이 듀것이라고 νŒλ‹¨λ˜λŠ” κ³³μ—μ„œλŠ” μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹μ„κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€.

 

 

낙관적 락 VS 비관적 락

사싀 μ–΄λ–€ 락 방법이 더 μ’‹λ‹€ 이런 κ±°λŠ” μ—†μŠ΅λ‹ˆλ‹€. ν˜„μž¬ 상황에 λ§žλŠ” 락 방법을 μ‚¬μš©ν•˜λŠ” 것이 κ°€μž₯ μ€‘μš”ν•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 그럼 μ–΄λ–€ μƒν™©μ—μ„œ μ–΄λ–€ 락 방법을 μ‚¬μš©ν•˜λŠ” 것이 μ’‹μ„κΉŒμš”? 방법을 μ„ νƒν•˜λŠ”λ° κ°€μž₯ μ€‘μš”ν•œ 것은 νŠΈλžœμž­μ…˜ κ°„μ˜ 좩돌 λΉˆλ„μž…λ‹ˆλ‹€.

 

  • 비관적 락
    • 좩돌이 많이 λ°œμƒν•˜κ³  λ°μ΄ν„°μ˜ 일관성, 정합성듀이 μ€‘μš”μ‹œλ˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜
  • 낙관적 락
    • 좩돌이 적게 λ°œμƒν•˜κ³  λ°μ΄ν„°μ˜ 일관성, μ •ν•©μ„±λ³΄λ‹€λŠ” μ„±λŠ₯이 μ€‘μš”μ‹œλ˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜

μš”μ•½ν•˜λ©΄, λΉ„관적 λ½μ€ λ™μ‹œμ„± μΆ©λŒμ΄ λ°œμƒν•  κ²ƒμœΌλ‘œ κ°€μ •ν•˜κ³  미리 락을 κ±Έμ–΄ λ™μ‹œ 접근을 μ°¨λ‹¨ν•˜λŠ” 방식이며, 낙관적 락은 λ™μ‹œμ„± 좩돌이 거의 λ°œμƒν•˜μ§€ μ•Šμ„ κ²ƒμœΌλ‘œ κ°€μ •ν•˜κ³  λ™μ‹œ 접근을 ν—ˆμš©ν•˜κ³  좩돌이 λ°œμƒν•˜λ©΄ κ·Έ μ‹œμ μ—μ„œ μ²˜λ¦¬ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.


μ°Έκ³  λΈ”λ‘œκ·Έ:  https://sabarada.tistory.com/175