πŸ—ƒοΈ λ°μ΄ν„°λ² μ΄μŠ€

Lock 총 정리1 - 기본적인 락 κ°œλ… & DB λ‚΄λΆ€ 락 ꡬ쑰

mallin 2025. 2. 14. 18:13

1. Lock μ΄λž€ ? 

Lock μ΄λž€ λ¬΄μ—‡μΌκΉŒμš” ? 

Lock 은 μ˜μ–΄λ‘œ "μž κ·Έλ‹€, μž κ°€ 두닀" λΌλŠ” λœ»μ„ κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. πŸ”

 

이λ₯Ό DB 에 μ μš©ν•΄λ³΄λ©΄

Lock 은 νŠΈλžœμž­μ…˜μ΄ μ™„λ²½ν•˜κ²Œ 끝날 λ•ŒκΉŒμ§€ λ‹€λ₯Έ μš”μ²­μ΄ ν•΄λ‹Ή 데이터에 μ ‘κ·Όν•˜μ§€ λͺ»ν•˜λ„둝 λ§‰λŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€.

이λ₯Ό 톡해 νŠΈλžœμž­μ…˜ 처리의 μˆœμ°¨μ„±μ„ 보μž₯ν•˜κ³ , λ°μ΄ν„°μ˜ 일관성을 μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ, Lock 은 DB κ°€ μ²˜λ¦¬ν•˜λŠ” κ°€μž₯ μž‘μ€ λ‹¨μœ„μž…λ‹ˆλ‹€. 


2-1. Lock 의 μ’…λ₯˜ 

Lock 은 적용 μš”μ†Œμ™€ μ μš©λ˜λŠ” 상황에 λ”°λΌμ„œ μ—¬λŸ¬κ°€μ§€λ‘œ λΆ„λ₯˜ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

적용 μš”μ†Œμ— λ‹€λ₯Έ λΆ„λ₯˜ 

: Lock 이 μ–΄λ–€ λ°©μ‹μœΌλ‘œ 데이터λ₯Ό μž κ·ΈλŠ”μ§€μ— 따라 λ‹€μŒκ³Ό 같이 λ‚˜λ‰©λ‹ˆλ‹€

  1. Shared Lock (S Lock, 곡유 락) - μ—¬λŸ¬ νŠΈλžœμž­μ…˜μ΄ λ™μ‹œμ— 읽을 수 μžˆμ§€λ§Œ, μ“°κΈ°λŠ” λΆˆκ°€λŠ₯
  2. Exclusive Lock (X Lock, 배타적 락) - ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜λ§Œ μ ‘κ·Ό κ°€λŠ₯ν•˜λ©°, 읽기와 μ“°κΈ° λͺ¨λ‘ ν—ˆμš©
  3. Intention Lock (μ˜λ„μ  락) - μƒμœ„ 객체에 락을 κ±ΈκΈ° 전에 미리 μ„€μ •ν•˜λŠ” 락

 

락이 μ μš©λ˜λŠ” 상황에 λ”°λ₯Έ λΆ„λ₯˜ 

: Lock 이 μ–΄λ–€ λ‹¨μœ„λ‘œ μ μš©λ˜λŠ”μ§€μ— 따라 λ‹€μŒκ³Ό 같이 λ‚˜λ‰©λ‹ˆλ‹€

  1. Row-level Lock - νŠΉμ • ν–‰ λ‹¨μœ„λ‘œ κ±Έλ¦¬λŠ” 락
  2. Record Lock - 인덱슀 λ ˆμ½”λ“œμ— κ±Έλ¦¬λŠ” 락
  3. Gap Lock - λ ˆμ½”λ“œ μ‚¬μ΄μ˜ 곡간에 κ±Έλ¦¬λŠ” 락
  4. Next-Key Lock - Record Lock + Gap Lock
  5. Insert Intention Lock - μƒˆλ‘œμš΄ 데이터 μ‚½μž…μ„ μœ„ν•΄ ν•„μš”ν•œ 락
  6. Auto-INC Lock - AUTO_INCREMENT 값을 관리 ν•˜κΈ° μœ„ν•œ 락

2-2. 적용 μš”μ†Œμ— λ”°λ₯Έ λΆ„λ₯˜ 

Lock 이 μ–΄λ–€ λ°©μ‹μœΌλ‘œ 데이터λ₯Ό μž κ·ΈλŠ”μ§€μ— λŒ€ν•΄μ„œ λΆ„λ₯˜λ˜κ³ , Shared Lock / Exclusive Lock / Intention Lock 이 μžˆμŠ΅λ‹ˆλ‹€

 

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

Shared Lock 은 νŠΉμ • ν–‰ λ‹¨μœ„λ‘œ κ±Έλ¦¬λŠ” Row-level Lock μž…λ‹ˆλ‹€.

읽기 (Read) 에 λŒ€ν•œ Lock 이며, μ—¬λŸ¬ νŠΈλžœμž­μ…˜μ΄ λ™μ‹œμ— 읽을 수 μžˆμ§€λ§Œ, μ“Έ 순 μ—†μŠ΅λ‹ˆλ‹€.

 

 

2. Exclusive Lock (X-Lock, 배타적 락)

Exclusive Lock 도 νŠΉμ • ν–‰ λ‹¨μœ„λ‘œ κ±Έλ¦¬λŠ” Row-level Lock μž…λ‹ˆλ‹€. 

μ“°κΈ° (Write) μ— λŒ€ν•œ Lock 이며, ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜λ§Œ μ ‘κ·Ό κ°€λŠ₯ν•˜λ©°, 읽기와 μ“°κΈ° λͺ¨λ‘λ₯Ό ν—ˆμš©ν•©λ‹ˆλ‹€.

ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜λ§Œ μ ‘κ·Ό κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ—, Lock 이 ν•΄μ œλ  λ•ŒκΉŒμ§€ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ€ ν•΄λ‹Ή 행에 μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€

 

SQL μ—μ„œ 직접 X-Lock 을 ν…ŒμŠ€νŠΈν•΄λ³Ό 수 μžˆλŠ”λ°μš”

-- 각 SQL λ¬Έμž₯이 μ¦‰μ‹œ λ°˜μ˜λ˜μ§€ μ•Šλ„λ‘ μ„€μ • (μžλ™ 컀밋 ν•΄μ œ)
SET autocommit=0;  
START TRANSACTION;

-- νŠΉμ • 데이터λ₯Ό μ—…λ°μ΄νŠΈν•˜λ©΄μ„œ X-Lock을 μ„€μ •
UPDATE test SET name = 'ν…ŒμŠ€νŠΈ' WHERE id = 1;

-- 이후 COMMIT ν•˜μ§€ μ•ŠμœΌλ©΄ Lock이 μœ μ§€λ¨
-- λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ€ 이 row에 μ ‘κ·Όν•  수 μ—†μŒ

 

1. μžλ™ 컀밋을 ν•΄μ œ (SQL 이 λλ‚˜κ³  μžλ™μ μœΌλ‘œ μ»€λ°‹λ˜μ§€ μ•Šλ„λ‘ ν•©λ‹ˆλ‹€)

2. νŠΈλžœμž­μ…˜ μ‹œμž‘ 

3. μ—…λ°μ΄νŠΈ ν•˜λ©΄μ„œ test ν…Œμ΄λΈ”μ˜ id = 1 인 row 에 X-Lock 을 κ²€

4. COMMIT ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— Lock 이 μœ μ§€

되게 λ©λ‹ˆλ‹€.

βœ”οΈ id = 1 인 row 에 X-Lock 이 걸렀있기 λ•Œλ¬Έμ— λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ€ ν•΄λ‹Ή 행에 μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€.

 

κ·Έλ ‡λ‹€λ©΄ X-Lock 이 κ±Έλ¦° row 에 S-Lock 이 걸릴 수 μžˆμ„κΉŒμš” ?

ν˜Ήμ€ κ·Έ λ°˜λŒ€μ˜ κ²½μš°μ—λŠ” μ–΄λ–¨κΉŒμš” ? 

그건 λ°”λ‘œ S-Lock κ³Ό X-Lock 의 경쟁 관계λ₯Ό ν†΅ν•΄μ„œ μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€

 

3. S-Lock vs X-Lock 의 경쟁 관계

S-Lock X-Lock
S-Lock κ°€λŠ₯ S-Lock λΆˆκ°€λŠ₯
X-Lock λΆˆκ°€λŠ₯ X-Lock λΆˆκ°€λŠ₯

 

μœ„μ˜ ν‘œλ₯Ό 톡해 S-Lock κ³Ό X-Lock 의 경쟁 관계λ₯Ό μ•Œ 수 μžˆλŠ”λ°μš”. 

S-Lock μ—λŠ” S-Lock 만 κ°€λŠ₯ν•˜κ³ , λͺ¨λ“  λ‹€λ₯Έ κ²½μš°μ—λŠ” λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€. 

μ •λ¦¬ν•΄λ³΄μžλ©΄ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€ 

  1. μ—¬λŸ¬ νŠΈλžœμž­μ…˜μ΄ ν•œ row 에 S-Lock 을 κ±Έ 수 μžˆλ‹€.
  2. S Lock 이 κ±Έλ € μžˆλŠ” row 에 λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ X-Lock 을 κ±Έ 수 μ—†λ‹€ 
  3. X-Lock 이 κ±Έλ € μžˆλŠ” row 에 λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ S-Lock, X-Lock 을 κ±Έ 수 μ—†λ‹€.

 

4. Intention Lock 

Intention Lock 은 S-Lock, X-Lock κ³ΌλŠ” λ‹€λ₯΄κ²Œ ν…Œμ΄λΈ” μ „μ²΄λ‘œ κ±Έλ¦¬λŠ” Table-level Lock μž…λ‹ˆλ‹€.

νŠΉμ • row 에 λŒ€ν•΄ λ‚˜μ€‘μ— Row-level Lock 을 κ±Έ 것을 미리 μ„ μ–Έν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€. 

이λ₯Ό 톡해 νŠΈλžœμž­μ…˜μ΄ νŠΉμ • ν…Œμ΄λΈ”μ˜ 일뢀 row 에 λŒ€ν•΄ 락을 μš”μ²­ν•  κ²ƒμž„μ„ λͺ…ν™•νžˆ ν•˜κ³ , λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ ν…Œμ΄λΈ” μˆ˜μ€€μ—μ„œ μž κΈˆμ„ μ„€μ •ν•˜λŠ” 것을 λ°©μ§€ν•©λ‹ˆλ‹€ 

 

Intention Lock 은 S-Lock κ³Ό X-Lock 을 κ²°ν•©ν•΄ 총 두가지 μ’…λ₯˜λ‘œ λ‚˜λ‰©λ‹ˆλ‹€.

  1. Intention Shared Lock (IS)
    • SELECT ... LOCK IN SHARE MODE μ‹€ν–‰ μ‹œ λ°œμƒν•©λ‹ˆλ‹€
    • ν•΄λ‹Ή ν…Œμ΄λΈ”μ—μ„œ 읽기 μž‘μ—…μ„ μˆ˜ν–‰ν•  μ˜λ„κ°€ μžˆμŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€
  2. Intention Exclusive Lock (IX)
    • SELECT ... FOR UPDATE, INSERT, DELETE, UPDATE μ‹€ν–‰μ‹œ λ°œμƒν•©λ‹ˆλ‹€
    • ν•΄λ‹Ή ν…Œμ΄λΈ”μ—μ„œ μ“°κΈ° μž‘μ—…μ„ μˆ˜ν–‰ν•  μ˜λ„κ°€ μžˆμŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€

IS, IX 락은 μ—¬λŸ¬ νŠΈλžœμž­μ…˜μ—μ„œ λ™μ‹œμ— μ ‘κ·Όκ°€λŠ₯ν•˜μ§€λ§Œ, μ‹€μ œ 데이터 λ³€κ²½ μ—¬λΆ€λŠ” Row-level Lock (S, X) 에 μ˜ν•΄ κ²°μ •λ©λ‹ˆλ‹€. 

 

κ·Έλ ‡λ‹€λ©΄ μ™œ Table-level Lock κ³Ό Row-level Lock 두 κ°€μ§€ Lock 이 ν•„μš”λ‘œ ν• κΉŒμš” ? 

λ°”λ‘œ, νŠΈλžœμž­μ…˜ κ°„ μΆ©λŒμ„ λ°©μ§€ν•˜κ³ , λ°μ΄ν„°μ˜ 정합성을 μœ μ§€ν•˜κΈ° μœ„ν•΄μ„œμž…λ‹ˆλ‹€. 

 

예λ₯Ό λ“€μ–΄ A νŠΈλžœμž­μ…˜μ΄ 이미 ν…Œμ΄λΈ”μ„ μˆ˜μ •ν•˜κ³  μžˆλŠ” κ²½μš°μ—λŠ” (IX 락)

-> B νŠΈλžœμž­μ…˜μ΄ ν•΄λ‹Ή ν…Œμ΄λΈ”μ˜ μŠ€ν‚€λ§ˆ 변경을 μ‹œλ„ν•˜μ§€ λͺ»ν•˜λ„둝 μ°¨λ‹¨ν•©λ‹ˆλ‹€ 

 

A νŠΈλžœμž­μ…˜μ΄ νŠΉμ • row λ₯Ό μ½κ³ μžˆλ‹€λ©΄ (IS 락)

-> B νŠΈλžœμž­μ…˜μ΄ ν•΄λ‹Ή row λ₯Ό μˆ˜μ •ν•˜μ§€ λͺ»ν•˜λ„둝 보μž₯ν•©λ‹ˆλ‹€. 

 

두 κ°€μ§€ Level 의 Lock 을 μ‚¬μš©ν•΄μ„œ λ°μ΄ν„°μ˜ 정합성을 λ”μš± 잘 μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€


2-3. μ μš©λ˜λŠ” 상황에 λ”°λ₯Έ λΆ„λ₯˜ 

Lock 이 μ–΄λ–€ λ‹¨μœ„λ‘œ μ μš©λ˜λŠ”μ§€μ— 따라 λΆ„λ₯˜λ˜κ³ ,

Row-level Lock / Record Lock / Gap Lock / Next-Key Lock / Insert Intention Lock / Auto-Inc Lock 이 μžˆμŠ΅λ‹ˆλ‹€

 

1. Row-level Lock

각 ν…Œμ΄λΈ”μ˜ κ°œλ³„ row λ§ˆλ‹€ κ±Έλ¦¬λŠ” Lock 으둜 μœ„μ—μ„œ 계속 μ–ΈκΈ‰λ˜μ—ˆλ˜ κ²ƒμ²˜λŸΌ S-Lock, X-Lock 이 μžˆμŠ΅λ‹ˆλ‹€

 

2. Record Lock

νŠΉμ • Insert Record 에 κ±Έλ¦¬λŠ” Lock 으둜 PK, UK 둜 μ‘°νšŒν•΄μ„œ ν•˜λ‚˜μ˜ 인덱슀 λ ˆμ½”λ“œμ—λ§Œ Lock 을 κ²λ‹ˆλ‹€

νŠΈλžœμž­μ…˜κ°„ λ™μΌν•œ λ ˆμ½”λ“œμ— λŒ€ν•œ μΆ©λŒμ„ λ°©μ§€ν•©λ‹ˆλ‹€

 

3. Gap Lock

DB index Record 의 Gap 에 κ±Έλ¦¬λŠ” Lock μž…λ‹ˆλ‹€. 

μ—¬κΈ°μ„œ gap μ΄λž€ ? 
μΈλ±μŠ€κ°€ μ‘΄μž¬ν•˜μ§€λ§Œ, μ‹€μ œ 데이터가 μ—†λŠ” λ²”μš°λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
예λ₯Ό λ“€μ–΄μ„œ id = 3 κ³Ό id = 7 인 λ ˆμ½”λ“œκ°€ μ‘΄μž¬ν•˜λŠ” 경우
id <= 2 λž‘ 3 < id < 7 λž‘ id >= 8 은 μ‹€μ œ λ ˆμ½”λ“œκ°€ μ—†λŠ” gap 이 λ©λ‹ˆλ‹€

 

이런 gap λ“€ 사이에 μƒˆλ‘œμš΄ insert κ°€ λ˜λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•œ Lock μž…λ‹ˆλ‹€. 

졜초 λ ˆμ½”λ“œμ˜ 이전, λ§ˆμ§€λ§‰ λ ˆμ½”λ“œμ˜ μ΄ν›„μ˜ Gap 에도 LocK 을 μ„€μ •ν•©λ‹ˆλ‹€

 

 

4. Next-Key Lock 

Record Lock κ³Ό Gap Lock 을 ν•¨κ»˜ μ‚¬μš©ν•˜λŠ” Lock μž…λ‹ˆλ‹€.

REPEATABLE READ μ—μ„œ Phanthom read λ₯Ό 막기 μœ„ν•΄ 탐색 μ‹œ Next-Key Lock 을 μ‚¬μš©ν•©λ‹ˆλ‹€. 

데이터 쑰회 μ‹œ gap κ³Ό ν•΄λ‹Ή λ ˆμ½”λ“œλ₯Ό λ™μ‹œμ— Lock ν•˜μ—¬μ„œ 데이터 μ‚½μž…μ„ μ°¨λ‹¨ν•©λ‹ˆλ‹€

 

5. Insert Intention Lock

insert μ‹œ λ°œμƒν•˜λŠ” νŠΉμˆ˜ν•œ ν˜•νƒœμ˜ Gap Lock μž…λ‹ˆλ‹€. 

  1. νŠΉμ • μœ„μΉ˜μ— INSERTκ°€ λ°œμƒν•˜λ©΄, ν•΄λ‹Ή μœ„μΉ˜μ— X-Lock을 κ±ΈκΈ° 전에 λ¨Όμ € Insert Intention Lock을 μ„€μ •ν•©λ‹ˆλ‹€
  2. κΈ°μ‘΄ νŠΈλžœμž­μ…˜κ³Ό μ‚½μž… μœ„μΉ˜κ°€ μΆ©λŒν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ λŒ€κΈ° 없이 INSERT μ§„ν–‰ κ°€λŠ₯ν•©λ‹ˆλ‹€

 

Gap Lock 과의 μ°¨μ΄μ μœΌλ‘œλŠ” 

  • Gap Lock은 ν•΄λ‹Ή ꡬ간에 μ–΄λ–€ λ ˆμ½”λ“œλ„ μΆ”κ°€λ˜μ§€ λͺ»ν•˜κ²Œ μ™„μ „νžˆ μ°¨λ‹¨ν•˜μ§€λ§Œ,
  • Insert Intention Lock은 μ‚½μž… μœ„μΉ˜κ°€ κ²ΉμΉ˜μ§€ μ•ŠμœΌλ©΄ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ˜ INSERTλ₯Ό ν—ˆμš©ν•©λ‹ˆλ‹€ → λŒ€κΈ° μ‹œκ°„ κ°μ†Œ

 

6. Auto-Inc Lock

AUTO_INCREMENT 컬럼 값을 νŠΈλžœμž­μ…˜ κ°„ μΌκ΄€λ˜κ²Œ μ¦κ°€μ‹œν‚€κΈ° μœ„ν•΄ μ„€μ •λ˜λŠ” Lock μž…λ‹ˆλ‹€. 

μ—¬λŸ¬ νŠΈλžœμž­μ…˜μ΄ λ™μ‹œμ— 싀행될 λ•Œ 각 νŠΈλžœμž­μ…˜μ΄ κ³ μœ ν•œ AUTO_INCREMENT 값을 받도둝 보μž₯ν•©λ‹ˆλ‹€

 


3.  Lock 이 ν•΄μ œλ˜λŠ” 타이밍

DB 에 μ„€μ •λœ Lock 은 λ‹€μŒκ³Ό 같은 두 κ°€μ§€ κ²½μš°μ— ν•΄μ œλ©λ‹ˆλ‹€

  1. νŠΈλžœμž­μ…˜μ΄ COMMIT 될 λ•Œ -> λ³€κ²½λœ 데이터가 영ꡬ적으둜 λ°˜μ˜λ˜λ©΄μ„œ Lock 이 ν•΄μ œλ©λ‹ˆλ‹€
  2. νŠΈλžœμž­μ…˜μ΄ ROLLBACK 될 λ•Œ -> λ³€κ²½λœ 데이터가 μ·¨μ†Œλ˜λ©΄μ„œ Lock 이 ν•΄μ œλ©λ‹ˆλ‹€

즉, νŠΈλžœμž­μ…˜μ΄ μ’…λ£Œλ  λ•Œ μžλ™μœΌλ‘œ Lock 이 ν•΄μ œλ©λ‹ˆλ‹€


4. κ²°λ‘ 

Lock 은 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ λ™μ‹œμ„±μ„ μ•ˆμ „ν•˜κ²Œ κ΄€λ¦¬ν•˜κ³ , λ°μ΄ν„°μ˜ 정합성을 μœ μ§€ν•˜λŠ” 핡심적인 μš”μ†Œμž…λ‹ˆλ‹€ !!!!

νŠΈλžœμž­μ…˜μ΄ 데이터λ₯Ό μ½κ±°λ‚˜ λ³€κ²½ν•  λ•Œ Lock 을 적절히 μ‚¬μš©ν•˜λ©΄ μ—¬λŸ¬ νŠΈλžœμž­μ…˜μ΄ μ•ˆμ „ν•˜κ²Œ λ™μž‘ν•  수 μžˆλ„λ‘ 보μž₯ν•©λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ, κ³Όλ„ν•œ Lock μ‚¬μš©μ€ μ„±λŠ₯ μ €ν•˜λ₯Ό μ΄ˆλž˜ν•  수 있고,

μ†Œκ·Ήμ μΈ Lock μ‚¬μš©μ€ λ°μ΄ν„°μ˜ 정합성을 μœ μ§€ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ μ ˆν•œ Lock 을 μ‚¬μš©ν•˜λŠ” 것이 맀우맀우 !!! μ€‘μš”ν•©λ‹ˆλ‹€.

 

λ‹€μŒ ν¬μŠ€ν‹°μ—μ„œλŠ” μ‹€μ œλ‘œ μ‚¬μš©λ˜λŠ” Lock 에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€