ν”Όλ“œλ‘œ λŒμ•„κ°€κΈ°
Stop Losing Data: How to Fix Race Conditions in Laravel πŸ›‘
Dev.toDev.to
Database

Pessimistic Locking을 ν†΅ν•œ SaaS λ™μ‹œμ„± μ œμ–΄ 및 데이터 무결성 확보

Stop Losing Data: How to Fix Race Conditions in Laravel πŸ›‘

Prajapati Paresh2026λ…„ 4μ›” 18일2λΆ„intermediate

Context

κ³ νŠΈλž˜ν”½ SaaS ν™˜κ²½μ—μ„œ λ‹€μˆ˜ μ‚¬μš©μžκ°€ 동일 데이터에 λ™μ‹œ μ ‘κ·Όν•  λ•Œ λ°œμƒν•˜λŠ” Race Condition 문제 뢄석. ν‘œμ€€ Eloquent μ—…λ°μ΄νŠΈ λ°©μ‹λ§ŒμœΌλ‘œλŠ” λ™μ‹œ μ“°κΈ° 이상 ν˜„μƒμ„ λ°©μ§€ν•˜μ§€ λͺ»ν•΄ μž”μ•‘ λ§ˆμ΄λ„ˆμŠ€ λ“± 데이터 μ˜€μ—Ό μœ„ν—˜ 쑴재.

Technical Solution

  • λ°μ΄ν„°λ² μ΄μŠ€ 레벨의 물리적 ν–‰ μž κΈˆμ„ κ°•μ œν•˜λŠ” Pessimistic Locking λ„μž…
  • Laravel의 lockForUpdate() λ©”μ„œλ“œλ₯Ό ν™œμš©ν•˜μ—¬ νŠΉμ • Row에 λŒ€ν•œ 독점적 μ ‘κ·Ό κΆŒν•œ 확보
  • DB::transaction 내뢀에 락 λ‘œμ§μ„ λ°°μΉ˜ν•˜μ—¬ νŠΈλžœμž­μ…˜ μ™„λ£Œ μ‹œμ μ— 잠금이 μžλ™ ν•΄μ œλ˜λŠ” ꡬ쑰 섀계
  • 락 점유 μ‹œκ°„ μ΅œμ†Œν™”λ₯Ό μœ„ν•΄ μ™ΈλΆ€ API 호좜 및 무거운 연산을 νŠΈλžœμž­μ…˜ μ™ΈλΆ€λ‘œ λΆ„λ¦¬ν•˜λŠ” μ „λž΅ 채택
  • μš”μ²­ νμž‰μœΌλ‘œ μΈν•œ νƒ€μž„μ•„μ›ƒ 병λͺ© ν˜„μƒμ„ λ°©μ§€ν•˜κΈ° μœ„ν•΄ '계산 ν›„ 잠금 및 μ—…λ°μ΄νŠΈ' μˆœμ„œμ˜ μ΅œμ ν™”λœ μ›Œν¬ν”Œλ‘œμš° 적용

1. 금육/재고 λ“± 데이터 무결성이 ν•„μˆ˜μ μΈ 도메인에 Pessimistic Locking 적용 μ—¬λΆ€ κ²€ν† 

2. `lockForUpdate()` μ‚¬μš© μ‹œ λ°˜λ“œμ‹œ DB Transaction λ²”μœ„ 내에 ν¬ν•¨λ˜μ—ˆλŠ”μ§€ 확인

3. νŠΈλžœμž­μ…˜ λ‚΄λΆ€μ—μ„œ μ™ΈλΆ€ HTTP Requestλ‚˜ λ³΅μž‘ν•œ 연산이 μˆ˜ν–‰λ˜μ–΄ 락 μœ μ§€ μ‹œκ°„μ΄ κΈΈμ–΄μ§€λŠ”μ§€ 점검

4. λ™μ‹œμ„± μ œμ–΄κ°€ ν•„μš”ν•œ 쿼리에 λŒ€ν•΄ DB μ—”μ§„μ˜ Lock Timeout 섀정을 적절히 ꡬ성

원문 읽기