πŸ” λ°μ΄ν„°λ² μ΄μŠ€ 락(DB Lock) μ΄ν•΄ν•˜κΈ°

POKUDINGΒ·2024λ…„ 12μ›” 24일

DB

λͺ©λ‘ 보기
3/3
post-thumbnail

DB Lockμ΄λž€? πŸ€”

  • DB Lock은 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ—¬λŸ¬ νŠΈλžœμž­μ…˜μ΄ λ™μ‹œμ— 같은 데이터에 μ ‘κ·Όν•  λ•Œ, λ°μ΄ν„°μ˜ 무결성(일관성)을 보μž₯ν•˜κΈ° μœ„ν•œ λ©”μ»€λ‹ˆμ¦˜μž…λ‹ˆλ‹€.
  • μ‰½κ²Œ 말해, ν•œ νŠΈλžœμž­μ…˜μ΄ νŠΉμ • 데이터에 λŒ€ν•΄ μž‘μ—… 쀑일 λ•Œ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ˜ 접근을 μ°¨λ‹¨ν•˜μ—¬ μΆ©λŒμ„ λ°©μ§€ν•˜λŠ” 잠금 μž₯μΉ˜μž…λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 λ°μ΄ν„°μ˜ 일관성을 μœ μ§€ν•˜κ³  좩돌 λ°©μ§€λ₯Ό 보μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

DB Lock의 ν•„μš”μ„± πŸ“Œ

  • λ°μ΄ν„°λ² μ΄μŠ€λŠ” μ—¬λŸ¬ μ‚¬μš©μžλ‚˜ μ‹œμŠ€ν…œμ΄ λ™μ‹œμ— 데이터λ₯Ό 읽고 μ“°λŠ” ν™˜κ²½μ—μ„œ μš΄μ˜λ©λ‹ˆλ‹€.
    이런 ν™˜κ²½μ—μ„œ λ°œμƒν•  수 μžˆλŠ” μ£Όμš” λ¬Έμ œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

1. Dirty Read (더티 λ¦¬λ“œ) πŸ›‘

ν•œ νŠΈλžœμž­μ…˜μ΄ 데이터λ₯Ό μˆ˜μ • 쀑일 λ•Œ, λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ ν•΄λ‹Ή 데이터λ₯Ό 읽으면 잘λͺ»λœ 데이터가 참쑰될 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ’‘ μ˜ˆμ‹œ:
1️⃣ νŠΈλžœμž­μ…˜ Aκ°€ 고객 κ³„μ’Œ μž”μ•‘μ— 1000원을 더해 5000원 β†’ 6000μ›μœΌλ‘œ μˆ˜μ •ν•˜μ§€λ§Œ, 아직 μ»€λ°‹ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.
2️⃣ νŠΈλžœμž­μ…˜ Bκ°€ μˆ˜μ • 쀑인 μž”μ•‘(6000원)을 읽어 잘λͺ»λœ 계산을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.
3️⃣ 이후 νŠΈλžœμž­μ…˜ Aκ°€ λ‘€λ°±λ˜μ–΄ μž”μ•‘μ€ 5000μ›μ΄μ§€λ§Œ, νŠΈλžœμž­μ…˜ BλŠ” 잘λͺ»λœ 데이터λ₯Ό 기반으둜 λ™μž‘ν•˜κ²Œ λ©λ‹ˆλ‹€.


2. Non-repeatable Read (반볡 λΆˆκ°€λŠ₯ν•œ 읽기) πŸ”

ν•œ νŠΈλžœμž­μ…˜μ΄ λ™μΌν•œ 데이터λ₯Ό 두 번 μ½μ—ˆμ„ λ•Œ 값이 λ³€κ²½λ˜λŠ” μƒν™©μž…λ‹ˆλ‹€.

πŸ’‘ μ˜ˆμ‹œ:
1️⃣ νŠΈλžœμž­μ…˜ Aκ°€ 고객 κ³„μ’Œ μž”μ•‘(5000원)을 μ½μŠ΅λ‹ˆλ‹€.
2️⃣ νŠΈλžœμž­μ…˜ Bκ°€ μž”μ•‘μ„ 7000μ›μœΌλ‘œ μˆ˜μ •ν•˜κ³  μ»€λ°‹ν•©λ‹ˆλ‹€.
3️⃣ νŠΈλžœμž­μ…˜ Aκ°€ 같은 데이터λ₯Ό λ‹€μ‹œ 읽으면 μž”μ•‘μ΄ 7000μ›μœΌλ‘œ λ³€κ²½λœ 것을 ν™•μΈν•©λ‹ˆλ‹€.


3. Lost Update (μ—…λ°μ΄νŠΈ 손싀) ❌

두 νŠΈλžœμž­μ…˜μ΄ λ™μ‹œμ— 데이터λ₯Ό μˆ˜μ •ν•˜λ € ν•  λ•Œ, ν•œ νŠΈλžœμž­μ…˜μ˜ μˆ˜μ • λ‚΄μš©μ΄ μ‚¬λΌμ§€λŠ” κ²½μš°μž…λ‹ˆλ‹€.

πŸ’‘ μ˜ˆμ‹œ:
1️⃣ νŠΈλžœμž­μ…˜ Aκ°€ μž”μ•‘μ„ 5000원 β†’ 6000μ›μœΌλ‘œ μˆ˜μ •ν•˜κ³  μ»€λ°‹ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.
2️⃣ νŠΈλžœμž­μ…˜ Bκ°€ μž”μ•‘μ„ 5000원 β†’ 7000μ›μœΌλ‘œ μˆ˜μ •ν•˜κ³  μ¦‰μ‹œ μ»€λ°‹ν•©λ‹ˆλ‹€.
3️⃣ 이후 νŠΈλžœμž­μ…˜ Aκ°€ 6000μ›μœΌλ‘œ μ»€λ°‹ν•˜λ©΄ νŠΈλžœμž­μ…˜ B의 μˆ˜μ • λ‚΄μš©(7000원)이 μ‚¬λΌμ§‘λ‹ˆλ‹€.


DB Lock의 μ’…λ₯˜ πŸ—‚οΈ

1. 곡유 락 (Shared Lock, S Lock) 🀝

  • 데이터λ₯Ό 읽을 λ•Œ μ‚¬μš©ν•˜λŠ” λ½μž…λ‹ˆλ‹€. μ—¬λŸ¬ νŠΈλžœμž­μ…˜μ΄ λ™μ‹œμ— 데이터λ₯Ό 읽을 수 μžˆμ§€λ§Œ, μˆ˜μ •μ€ λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

πŸ’‘ μ˜ˆμ‹œ:
1️⃣ νŠΈλžœμž­μ…˜ Aκ°€ 고객 정보λ₯Ό μ‘°νšŒν•©λ‹ˆλ‹€. (곡유 락이 κ±Έλ¦½λ‹ˆλ‹€.)
2️⃣ νŠΈλžœμž­μ…˜ B도 같은 데이터λ₯Ό μ‘°νšŒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
3️⃣ κ·ΈλŸ¬λ‚˜ νŠΈλžœμž­μ…˜ Cκ°€ 데이터λ₯Ό μˆ˜μ •ν•˜λ €κ³  μ‹œλ„ν•˜λ©΄ λŒ€κΈ° μƒνƒœκ°€ λ©λ‹ˆλ‹€.


2. 배타 락 (Exclusive Lock, X Lock) 🚫

  • 데이터λ₯Ό μˆ˜μ •ν•  λ•Œ μ‚¬μš©ν•˜λŠ” λ½μž…λ‹ˆλ‹€. 배타 락이 걸리면 λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ€ 데이터λ₯Ό μ½κ±°λ‚˜ μˆ˜μ •ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

πŸ’‘ μ˜ˆμ‹œ:
1️⃣ νŠΈλžœμž­μ…˜ Aκ°€ μƒν’ˆμ˜ 재고λ₯Ό μˆ˜μ •ν•˜λ©° 배타 락을 μ„€μ •ν•©λ‹ˆλ‹€.
2️⃣ νŠΈλžœμž­μ…˜ B와 Cκ°€ 재고λ₯Ό μ‘°νšŒν•˜κ±°λ‚˜ μˆ˜μ •ν•˜λ €κ³  ν•˜λ©΄ λŒ€κΈ° μƒνƒœκ°€ λ©λ‹ˆλ‹€.
3️⃣ νŠΈλžœμž­μ…˜ Aκ°€ μž‘μ—…μ„ μ™„λ£Œν•˜κ³  락을 ν•΄μ œν•œ 후에야, λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ μ§„ν–‰λ©λ‹ˆλ‹€.


3. 비관적 락 (Pessimistic Locking) πŸ›‘οΈ

  • 데이터λ₯Ό 읽을 λ•ŒλΆ€ν„° 락을 κ±Έμ–΄ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ˜ 접근을 μ°¨λ‹¨ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

πŸ’‘ μ˜ˆμ‹œ:
1️⃣ νŠΈλžœμž­μ…˜ Aκ°€ κ³„μ’Œ μž”μ•‘μ„ μ‘°νšŒν•˜λ©° 비관적 락을 μ„€μ •ν•©λ‹ˆλ‹€.
2️⃣ νŠΈλžœμž­μ…˜ Bκ°€ λ™μΌν•œ 데이터λ₯Ό μ‘°νšŒν•˜λ €κ³  ν•˜λ©΄ λŒ€κΈ° μƒνƒœκ°€ λ©λ‹ˆλ‹€.
3️⃣ νŠΈλžœμž­μ…˜ Aκ°€ μž‘μ—…μ„ 끝내고 락을 ν•΄μ œν•œ 후에야, νŠΈλžœμž­μ…˜ Bκ°€ μ§„ν–‰λ©λ‹ˆλ‹€.


4. 낙관적 락 (Optimistic Locking) 😊

  • 데이터λ₯Ό μˆ˜μ •ν•  λ•Œ μΆ©λŒμ„ κ°μ§€ν•˜λŠ” λ°©μ‹μœΌλ‘œ, μˆ˜μ • μ „μ—λŠ” 락을 κ±Έμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

πŸ’‘ μ˜ˆμ‹œ:
1️⃣ νŠΈλžœμž­μ…˜ A와 Bκ°€ λ™μ‹œμ— μƒν’ˆ 가격을 μˆ˜μ •ν•˜λ € ν•©λ‹ˆλ‹€.
2️⃣ νŠΈλžœμž­μ…˜ Aκ°€ 가격을 μˆ˜μ •ν•˜κ³  버전을 1 β†’ 2둜 μ¦κ°€μ‹œν‚΅λ‹ˆλ‹€.
3️⃣ νŠΈλžœμž­μ…˜ BλŠ” μΆ©λŒμ„ κ°μ§€ν•˜κ³  μˆ˜μ • μž‘μ—…μ„ μž¬μ‹œλ„ν•˜κ±°λ‚˜ μ€‘λ‹¨ν•©λ‹ˆλ‹€.


5. λͺ…λͺ…λœ 락 (Named Lock) 🏷️

  • νŠΉμ • μ΄λ¦„μœΌλ‘œ μ„€μ •ν•œ 락을 톡해 λ¦¬μ†ŒμŠ€ 접근을 μ œμ–΄ν•©λ‹ˆλ‹€.

πŸ’‘ μ˜ˆμ‹œ:
1️⃣ νŠΈλžœμž­μ…˜ Aκ°€ "μ›”κ°„ λ³΄κ³ μ„œ 생성"μ΄λΌλŠ” 락을 μ„€μ •ν•©λ‹ˆλ‹€.
2️⃣ νŠΈλžœμž­μ…˜ BλŠ” 같은 μž‘μ—…μ„ μ‹œλ„ν•˜λ € ν•˜μ§€λ§Œ λŒ€κΈ° μƒνƒœκ°€ λ©λ‹ˆλ‹€.
3️⃣ νŠΈλžœμž­μ…˜ Aκ°€ μž‘μ—…μ„ μ™„λ£Œν•œ ν›„, νŠΈλžœμž­μ…˜ Bκ°€ μ‹€ν–‰λ©λ‹ˆλ‹€.


6. λΆ„μ‚° 락 (Distributed Lock) 🌍

  • μ—¬λŸ¬ μ‹œμŠ€ν…œμ—μ„œ λ™μΌν•œ μžμ›μ— λŒ€ν•œ 접근을 μ œμ–΄ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€. Redis 같은 μ‹œμŠ€ν…œμ—μ„œ 주둜 κ΅¬ν˜„λ©λ‹ˆλ‹€.

πŸ’‘ μ˜ˆμ‹œ:
1️⃣ μ„œλ²„ Aκ°€ μ’Œμ„ 10번 μ˜ˆμ•½μ„ μ‹œλ„ν•˜λ©° Redis에 락을 μ„€μ •ν•©λ‹ˆλ‹€.
2️⃣ μ„œλ²„ B도 μ’Œμ„ 10λ²ˆμ„ μ˜ˆμ•½ν•˜λ € ν•˜μ§€λ§Œ 락이 μ„€μ •λ˜μ–΄ λŒ€κΈ° μƒνƒœκ°€ λ©λ‹ˆλ‹€.
3️⃣ μ„œλ²„ Aκ°€ μž‘μ—…μ„ μ™„λ£Œν•˜κ³  락을 ν•΄μ œν•˜λ©΄, μ„œλ²„ Bκ°€ μž‘μ—…μ„ μ‹œμž‘ν•©λ‹ˆλ‹€.


DB Lock은 λ°μ΄ν„°λ² μ΄μŠ€ ν™˜κ²½μ—μ„œ λ°μ΄ν„°μ˜ 무결성과 일관성을 보μž₯ν•˜λŠ” 데 μ€‘μš”ν•œ 역할을 ν•©λ‹ˆλ‹€.
μ μ ˆν•œ 락 μ „λž΅μ„ μ„ νƒν•˜λ©΄ λ™μ‹œμ„± 문제λ₯Ό λ°©μ§€ν•˜κ³ , 효율적인 데이터 처리λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

profile
세상을 λ°”κΎΈλŠ” κΏˆμ„ κΎΈλŠ” 개발자

0개의 λŒ“κΈ€