Optimistic Lock (낙관적 락) 재시도 로직
- Optimistic Lock (낙관적 락) 에서는 실패했을 경우 재시도를 해야하는데, 아래 다양한 방법들을 통해 구현할 수 있다.
💡Spring Retry
💡Facade 패턴
@Component
@RequiredArgsConstructor
public class StockRetryFacade {
private final StockService stockService; // @Transactional 메서드 가진 서비스
public StockResult decreaseWithRetry(StockRequests.Decrease request)
throws InterruptedException {
int maxRetries = 100;
int attempt = 0;
while (true) {
try {
return stockService.decreaseStock(request); // 1회 시도 (새 트랜잭션)
} catch (OptimisticLockingFailureException e) {
if (++attempt >= maxRetries) {
throw e;
}
Thread.sleep(50);
}
}
}
}
재시도 구현 시 검토해야 할 4가지 원칙
💡Fresh Read의 원칙 (최신 데이터 재조회)
💡지수 백오프와 지터
💡멱등성(Idempotency) 보장
💡최대 재시도 횟수 제한
참고 자료
1) 뱅크샐러드 블로그 : 뱅크샐러드가 게임을 만들 때 데이터 정합성을 유지하는 법 (feat. 낙관적 락)
https://blog.banksalad.com/tech/banksalad-optimistic-lock/
뱅크샐러드가 게임을 만들 때 데이터 정합성을 유지하는 법 (feat. 낙관적 락) | 뱅크샐러드
안녕하세요 금융쇼핑 PA…
blog.banksalad.com
'Projects > HubEleven' 카테고리의 다른 글
| [동시성 처리] DB Lock : Optimistic Lock (낙관적 락) - 실습 (0) | 2026.02.20 |
|---|---|
| [동시성 처리] Trouble Shooting : Pessimistic Lock 적용 오류 (0) | 2026.02.19 |
| [동시성 처리] DB Lock : Pessimistic Lock (비관적 락) - 실습 (0) | 2026.02.18 |
| [동시성 처리] Trouble Shooting : 멀티스레드 재고 감소 통합 테스트 코드 Eureka Server Connection refused (0) | 2026.02.16 |
| [동시성 처리] synchronized vs Reentrant Lock - 실습 (0) | 2026.02.15 |