Post

DB Lock

Concurrency

μ—¬λŸ¬ μž‘μ—…μ΄ λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” κ²ƒμ²˜λŸΌ 보이도둝 κ΄€λ¦¬λ˜λŠ” μƒνƒœ
ν•˜λ‚˜μ˜ CPUμ—μ„œ μ—¬λŸ¬ μž‘μ—…μ΄ 싀행될 λ•Œ, CPUλŠ” λΉ λ₯΄κ²Œ μž‘μ—…μ„ μ „ν™˜ν•˜μ—¬ 마치 μ—¬λŸ¬ μž‘μ—…μ΄ λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” κ²ƒμ²˜λŸΌ 보이게 ν•œλ‹€.

λ™μ‹œμ„±μ„ ν™œμš©ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ˜ μ—¬λŸ¬ 뢀뢄이 λ™μ‹œμ— μ‹€ν–‰λ˜μ–΄, 더 λ§Žμ€ μž‘μ—…μ„ λΉ λ₯΄κ²Œ μ²˜λ¦¬ν•  수 있고, μžμ›μ„ 효율적으둜 μ‚¬μš©ν•˜λ©°, 응닡을 ν–₯μƒμ‹œν‚¬ 수 μžˆλ‹€.

특히 λ°μ΄ν„°λ² μ΄μŠ€λŠ” λ‹€μˆ˜μ˜ μ‚¬μš©μžκ°€ λ™μ‹œμ— μ ‘κ·Όν•œλ‹€. 이 κ³Όμ •μ—μ„œ μ‚¬μš©μžμ— λŒ€ν•œ μ œμ–΄κ°€ μ μ ˆν•˜κ²Œ 이루어지지 μ•ŠμœΌλ©΄ λ°μ΄ν„°μ˜ 일관성과 무결성이 κΉ¨μ§€κ²Œ λœλ‹€. λ”°λΌμ„œ λ™μ‹œμ„± μ œμ–΄λ₯Ό 톡해 μ—¬λŸ¬ μ‚¬μš©μžκ°€ λ™μ‹œμ— μ—¬λŸ¬ 개의 νŠΈλžœμž­μ…˜μ„ μˆ˜ν–‰ λ•Œ, λ°μ΄ν„°μ˜ 일관성이 깨지지 μ•Šλ„λ‘ ν•΄μ•Όν•œλ‹€.


락의 λ²”μœ„

DB, 파일, ν…Œμ΄λΈ”, νŽ˜μ΄μ§€, 컬럼 λ“±




낙관적 락 (Optimistic Lock)

optimistic.png

μžμ›μ— 락을 걸지 μ•Šκ³ , λ™μ‹œμ„± λ¬Έμ œκ°€ λ°œμƒν•˜λ©΄ κ·Έλ•Œ κ·Έλ•Œ μ²˜λ¦¬ν•˜λŠ” 방식

μˆ˜μ • μž‘μ—…μ„ ν• λ•Œ μˆ˜μ •ν–ˆλ‹€κ³  λͺ…μ‹œν•˜μ—¬ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ λ™μΌν•œ 쑰건으둜 값을 μˆ˜μ •ν•  수 없도둝 ν•œλ‹€.

versionκ³Ό 같은 λ³„λ„μ˜ μ»¬λŸΌμ„ μΆ”κ°€ν•˜μ—¬ 좩돌의 λ°œμƒμ„ λ§‰λŠ”λ‹€. version(hashcode/ timestamp)의 μƒνƒœλ‘œ μΆ©λŒμ„ ν™•μΈν•˜λ©°, 좩돌된 경우 λ‘€λ°±ν•œλ‹€.

데이터 좩돌이 자주 μΌμ–΄λ‚˜μ§€ μ•Šμ„ 것이라고 μ˜ˆμƒλ˜λŠ” 경우 주둜 μ‚¬μš©ν•œλ‹€.
쑰회 μž‘μ—…μ΄ 많기 λ•Œλ¬Έμ— λ™μ‹œ μ ‘κ·Ό μ„±λŠ₯이 μ€‘μš”ν•˜λ‹€.

μž₯단점

좩돌이 μ•ˆλ‚œλ‹€λŠ” κ°€μ •ν•˜μ—, λ™μ‹œ μš”μ²­μ— λŒ€ν•œ 처리 μ„±λŠ₯이 μ’‹λ‹€.

κ·ΈλŸ¬λ‚˜ 좩돌이 λΉˆλ²ˆν•˜κ²Œ μΌμ–΄λ‚˜λŠ” 경우, λ‘€λ°±μ²˜λ¦¬μ— λŒ€ν•œ λΉ„μš©μ΄ 많이 λ“€μ–΄ μ„±λŠ₯이 λ–¨μ–΄μ§ˆ 수 μžˆλ‹€.
λ˜ν•œ, κ°œλ°œμžκ°€ 직접 둀백을 κ΅¬ν˜„ν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— μ‹œμŠ€ν…œ ꡬ쑰에 따라 λ³΅μž‘ν•΄μ§ˆ 수 μžˆλ‹€.




비관적 락 (Pessimistic Lock)

pessimistic.png 곡유 μžμ›μ— μ ‘κ·Όν•  λ•Œ, 데이터 좩돌이 λ°œμƒν•  κ°€λŠ₯성을 미리 κ³ λ €ν•˜κ³  이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ μžμ›μ— λŒ€ν•΄ 락을 미리 κ±°λŠ” 방법

ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μ΄ μžμ›μ— μ ‘κ·Όμ‹œ 락을 κ±Έκ³ , λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ μ ‘κ·Όν•˜μ§€ λͺ»ν•˜κ²Œ ν•˜μ—¬ 쑰회 λ˜λŠ” κ°±μ‹  μ²˜λ¦¬κ°€ μ™„λ£Œλ  λ•ŒκΉŒμ§€ 락을 μœ μ§€ν•œλ‹€.

  • Shared Lock(곡유, 읽기 잠금)
  • Exclusive Lock(배타, μ“°κΈ° 잠금)

좩돌이 자주 λ°œμƒν•˜λŠ” 상황에 μœ λ¦¬ν•˜λ©° λ°μ΄ν„°μ˜ 무결성을 보μž₯ν•œλ‹€. ν•˜μ§€λ§Œ 쑰회 μž‘μ—…μ΄ λ§Žμ€ 경우 μ„±λŠ₯이 떨어지고, μ„œλ‘œ μžμ›μ΄ ν•„μš”ν•œ 경우 λ°λ“œλ½μ— 걸릴 κ°€λŠ₯성이 μžˆλ‹€.

deadlock.png

λ”°λΌμ„œ, 쑰건을 μΆ”κ°€ν•˜μ—¬ λŒ€κΈ°μ‹œκ°„μ„ μ£Όκ±°λ‚˜ μ˜ˆμ™Έ 처리λ₯Ό ν•  수 μžˆλ‹€.

NO WIAT

μž κΈˆμ„ νšλ“ν•˜μ§€ λͺ»ν•˜λ©΄ λ°”λ‘œ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.
νŠΈλžœμž­μ…˜μ€ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ˜ 잠금이 ν•΄μ œλ  λ•ŒκΉŒμ§€ λŒ€κΈ°ν•˜μ§€ μ•Šκ³ , λ°”λ‘œ μ‹€νŒ¨ν•œλ‹€.
즉각 적인 μ‹€νŒ¨ 응닡이 ν•„μš”ν•œ 경우 μ‚¬μš©

WAIT[n]

νŠΈλžœμž­μ…˜μ΄ μž κΈˆμ„ μš”μ²­ν–ˆμ„ λ•Œ, ν•΄λ‹Ή μžμ›μ΄ μž κ²¨μžˆλŠ” 경우, μ΅œλŒ€ n 초 λ™μ•ˆ λŒ€κΈ°ν•œλ‹€.
n 초 λ™μ•ˆ 잠금이 ν•΄μ œλ˜μ§€ μ•ŠμœΌλ©΄ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©° νŠΈλžœμž­μ…˜μ΄ μ‹€νŒ¨ν•œλ‹€.

νŠΈλžœμž­μ…˜μ΄ μ‹œμž‘λ  λ•Œ Shared Lock λ˜λŠ” Exclusive Lock을 κ±Έκ³  μ‹œμž‘ν•œλ‹€.


곡유 락 (Shared Lock, Read Lock)

νŠΉμ • μžμ›μ— λŒ€ν•΄ μ—¬λŸ¬ νŠΈλžœμž­μ…˜μ΄ λ™μ‹œμ— 읽기 μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλ„λ‘ ν—ˆμš©ν•˜λŠ” 락

μ—¬λŸ¬ νŠΈλžœμž­μ…˜μ΄ λ™μ‹œμ— μ ‘κ·Όν•˜μ—¬ 데이터λ₯Ό 읽을 수 μžˆμ§€λ§Œ, μ“°κΈ° μž‘μ—…μ€ μ œν•œλœλ‹€. 주둜 데이터 읽기의 λ™μ‹œμ„±μ„ 높이기 μœ„ν•΄ μ‚¬μš©ν•˜λ©°, μ–΄λ–€ μžμ›μ— 곡유락이 λ™μ‹œμ— μ—¬λŸ¬ 개 적용될 수 μžˆλ‹€.

일반적으둜 select ν•  λ•Œ 곡유락이 λ°œμƒν•˜λ©°, μ–΄λ–€ μžμ›μ΄ κ³΅μœ λ½μ— κ±Έλ €μžˆλŠ” 경우 베타적 락을 κ±Έ 수 μ—†λ‹€.

곡유락의 νŠΉμ§•

  1. λ™μ‹œ 읽기 ν—ˆμš©
    곡유락이 μ„€μ •λœ μžμ›μ€ μ—¬λŸ¬ νŠΈλžœμž­μ…˜μ΄ λ™μ‹œμ— 읽을 수 μžˆλ‹€. 데이터λ₯Ό μ½λŠ” μž‘μ—…μ΄ λ³‘λ ¬λ‘œ μˆ˜ν–‰λ˜κΈ° λ•Œλ¬Έμ— μ„±λŠ₯이 ν–₯μƒλœλ‹€.
  2. μ“°κΈ° μ œν•œ
    곡유락이 μ„€μ •λœ μžμ›μ— λŒ€ν•΄ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ μ“°κΈ° μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ €κ³  ν•˜λ©΄ κ·Έ νŠΈλžœμž­μ…˜μ€ 곡유락이 ν•΄μ œλ  λ•ŒκΉŒμ§€ λŒ€κΈ°ν•΄μ•Ό ν•œλ‹€. 데이터λ₯Ό μΌκ΄€λ˜κ²Œ μœ μ§€ν•˜κ³ , 읽기 쀑인 데이터가 λ³€κ²½λ˜μ§€ μ•Šλ„λ‘ 보μž₯ν•œλ‹€.
  3. 락 좩돌
    λ§Œμ•½ ν•œ νŠΈλžœμž­μ…˜μ΄ κ³΅μœ λ½μ„ κ±Έκ³  데이터λ₯Ό 읽고 μžˆμ„ λ•Œ, λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ ν•΄λ‹Ή μžμ›μ— 배타락을 κ±Έλ €κ³  μ‹œλ„ν•˜λ©΄ 좩돌이 λ°œμƒν•œλ‹€. 이 경우 μ“°κΈ° μž‘μ—…μ€ 곡유락이 ν•΄μ œλ  λ•ŒκΉŒμ§€ λŒ€κΈ°ν•œλ‹€.
  4. 데이터 일관성 μœ μ§€
    κ³΅μœ λ½μ€ νŠΈλžœμž­μ…˜μ΄ 데이터λ₯Ό μ½λŠ” λ™μ•ˆ ν•΄λ‹Ή 데이터가 λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ— μ˜ν•΄ λ³€κ²½λ˜μ§€ μ•Šλ„λ‘ λ³΄ν˜Έν•œλ‹€.

곡유락의 μž₯단점

μ—¬λŸ¬ νŠΈλžœμž­μ…˜μ΄ λ™μ‹œμ— 데이터λ₯Ό 읽을 수 μžˆμ–΄ 읽기 μž‘μ—…μ˜ νš¨μœ¨μ„±μ΄ λ†’μœΌλ©°, 데이터λ₯Ό μ½λŠ” λ™μ•ˆ λ°μ΄ν„°μ˜ 일관성을 μœ μ§€ν•  수 μžˆλ‹€. κ·ΈλŸ¬λ‚˜ μ—¬λŸ¬ νŠΈλžœμž­μ…˜μ΄ κ³΅μœ λ½μ„ μ„€μ •ν•œ μƒνƒœμ—£μ„œλŠ” μ“°κΈ° μž‘μ—…μ„ κΈ°λ‹€λ €μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— μ„±λŠ₯μ €ν•˜κ°€ λ°œμƒν•  수 μžˆλ‹€. λ˜ν•œ λ°λ“œλ½μ΄ λ°œμƒν•  수 μžˆλ‹€.


배타 락 (Exclusive Lock, Write Lock)

νŠΉμ • μžμ›(데이터, ν–‰, ν…Œμ΄λΈ” λ“±)에 λŒ€ν•΄ ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μ΄ λ…μ μ μœΌλ‘œ μ ‘κ·Όν•  수 μžˆλ„λ‘ μ„€μ •ν•˜λŠ” 락

배타락이 κ±Έλ¦° μžμ›μ—λŠ” λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ 읽기, μ“°κΈ° μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μ—†λ‹€.

1
SELECT * FROM Member WHERE id = 1 FOR UPDATE;

배타락을 μ„€μ •ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” ꡬ문이며, ν•΄λ‹Ή 데이터에 쓰기락을 κ±Έμ–΄, λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ λ™μ‹œμ— κ·Έ 데이터에 μ ‘κ·Ό, μˆ˜μ •ν•˜μ§€ λͺ»ν•˜λ„둝 ν•œλ‹€.

λ°°νƒ€λ½μ˜ νŠΉμ§•

  1. 독점적 μ ‘κ·Ό
    μžμ›μ„ 잠근 νŠΈλžœμž­μ…˜μ΄ μžμ›μ„ λ…μ μ μœΌλ‘œ μ ‘κ·Έν•  수 μžˆλ‹€. λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ€ ν•΄λ‹Ή μžμ›μ΄ μž κ²¨μžˆλŠ” λ™μ•ˆ μ ‘κ·Όν•  수 μ—†λ‹€.
  2. μ“°κΈ° μž‘μ—… 보호
    일반적으둜 μ“°κΈ°(μˆ˜μ •, μ‚­μ œ, μ‚½μž… λ“±) μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° 전에 μ„€μ •λœλ‹€. λ”°λΌμ„œ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ ν•΄λ‹Ή μžμ›μ„ λ™μ‹œμ— μˆ˜μ •ν•˜μ§€ λͺ»ν•˜λ„둝 ν•˜μ—¬ μΆ©λŒμ„ λ°©μ§€ν•œλ‹€.
  3. λ™μ‹œμ„± μ œμ–΄
    데이터λ₯Ό λ³΄ν˜Έν•˜κ³  μ—¬λŸ¬ νŠΈλžœμž­μ…˜μ΄ λ™μ‹œμ— 데이터λ₯Ό μ²˜λ¦¬ν•  λ•Œ λ°œμƒν•  수 μžˆλŠ” 문제λ₯Ό μ˜ˆλ°©ν•œλ‹€.
  4. 락 λŒ€κΈ°
    λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ 배타락이 κ±Έλ¦° μžμ›μ— μ ‘κ·Όν•˜λ €κ³  ν•˜λ©΄, ν•΄λ‹Ή νŠΈλžœμž­μ…˜μ€ 락이 ν•΄μ œλ  λ•ŒκΉŒμ§€ λŒ€κΈ°ν•΄μ•Ό ν•œλ‹€.

예λ₯Ό λ“€μ–΄, 은행 μ‹œμŠ€ν…œμ—μ„œ νŠΉμ • κ³„μ’Œμ˜ μž”μ•‘μ„ μˆ˜μ •ν•˜λŠ” νŠΈλžœμž­μ…˜μ΄ μžˆλ‹€.

νŠΈλžœμž­μ…˜ Aκ°€ κ³„μ’Œμ˜ μž”μ•‘μ„ μˆ˜μ •ν•˜λ €κ³  ν•  λ•Œ, λ¨Όμ € ν•΄λ‹Ή κ³„μ’Œ 데이터에 배타락을 μ„€μ •ν•œλ‹€. μ΄λ•Œ, νŠΈλžœμž­μ…˜ Aκ°€ μž‘μ—…μ„ μ™„λ£Œν•˜κ³  락을 ν•΄μ œν•  λ•ŒκΉŒμ§€, νŠΈλžœμž­μ…˜ BλŠ” κ·Έ κ³„μ’Œμ— μ ‘κ·Όν•  수 μ—†κ²Œλœλ‹€. νŠΈλžœμž­μ…˜ Aκ°€ μž‘μ—…μ„ μ™„λ£Œν•œ ν›„ 락을 ν•΄μ œν•˜λ©΄, νŠΈλžœμž­μ…˜ Bκ°€ κ³„μ’Œμ— μ ‘κ·Όν•  수 μžˆλ‹€.

λ°μ΄ν„°μ˜ 무결성과 일관성을 보μž₯ν•˜λ©° μΆ©λŒμ„ 미리 λ°©μ§€ν•˜μ—¬ λ°μ΄ν„°μ˜ 손상과 λΉ„ 일관성을 λ°©μ§€ν•œλ‹€.

κ·ΈλŸ¬λ‚˜ μžμ›μ΄ 락이 κ±Έλ¦° λ™μ•ˆ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ λŒ€κΈ°ν•΄μ•Ό ν•˜λ―€λ‘œ μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•  수 있으며, λŒ€κΈ° μ‹œκ°„μ΄ κΈΈμ–΄μ§ˆ 경우, λ°λ“œλ½μ˜ κ°€λŠ₯성이 μ¦κ°€ν•œλ‹€.

λ°°νƒ€λ½μ˜ μž₯단점

λ°μ΄ν„°μ˜ 무결성과 일관성을 보μž₯ν•˜λ©°, μΆ©λŒμ„ 사전에 λ°©μ§€ν•˜κΈ° λ•Œλ¬Έμ— λ°μ΄ν„°μ˜ 손상과 비일관성을 방지할 수 μžˆλ‹€.

κ·ΈλŸ¬λ‚˜ μžμ›μ΄ 락에 κ±Έλ¦° λ™μ•ˆ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ λŒ€κΈ°ν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•  수 있으며, λŒ€κΈ° μ‹œκ°„μ΄ κΈΈμ–΄μ§ˆ 경우 λ°λ“œλ½μ˜ κ°€λŠ₯성이 μ¦κ°€ν•œλ‹€.

This post is licensed under CC BY 4.0 by the author.