Projects/HubEleven

[동시성 처리] Optimistic Lock (낙관적 락) 재시도 로직

annovation 2026. 2. 23. 23:53

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