← 질문 목록
#13깊이 0
낙관적 락 충돌은 어떻게 재시도하는가?
예외를 잡아 정해진 횟수만큼 다시 시도한다. JPA는 OptimisticLockException을 던지고 Spring의 예외 번역을 거치면 ObjectOptimisticLockingFailureException 계열로 바뀐다.
바로 다시 걸지는 않는다. 즉시 재시도하면 같은 충돌이 연달아 난다. 조금 기다렸다 하는 백오프를 두고 무작위 지터를 섞어 몰리는 것을 흩는다.
급소는 트랜잭션 경계다. 예외가 난 트랜잭션 안에서 루프를 돌면 그 트랜잭션이 롤백 전용으로 표시돼 재시도가 먹지 않는다.
그래서 재시도는 트랜잭션 바깥에서 돈다. 매 시도가 새 트랜잭션으로 시작해야 한다. @Retryable을 쓴다면 프록시를 타도록 바깥 빈에 건다.
상한은 반드시 둔다. 무한 재시도가 몰리면 커넥션을 다 써 버린다. 상한을 넘기면 실패로 알리거나 큐로 넘겨 보상한다 — 무엇을 고를지는 업무가 정한다.