version(또는 timestamp) 컬럼을 둠UPDATE account SET balance = ?, version = version + 1
WHERE id = ? AND version = :read_version; -- affected rows = 0 이면 그새 누가 바꿈 → 충돌
@Version 필드(Long/int/timestamp)WHERE version = ?를 붙이고 version을 증가OptimisticLockException(Spring의 OptimisticLockingFailureException)@Retryable 등으로 감싸고 짧은 backoff·최대 횟수를 둠 (재시도)| 낙관적 락 | 비관적 락 | |
|---|---|---|
| 방식 | 진행 후 커밋 시 충돌 감지 | 미리 잠금 |
| happy-path 비용 | 락 0 | 락 획득·대기 |
| 충돌 시 | 재시도 | 대기(블록) |
| 적합 | 저경합 | 고경합 |
| 데드락 | 없음(락 미보유) | 가능 |