낙관적 잠금
먼저 읽고 나중에 version 또는 조건부 update로 충돌을 감지한다.
적합
수정 빈도 낮음, 재시도 쉬움, 긴 사용자 작업
실패 처리
OptimisticLockException 또는 영향받은 행 0개를 보고 재조회한다.
충돌이 드물고 재시도가 쉬우면 낙관적 잠금, 충돌 비용이 크고 먼저 막아야 하면 비관적 잠금을 선택한다.
먼저 읽고 나중에 version 또는 조건부 update로 충돌을 감지한다.
수정 빈도 낮음, 재시도 쉬움, 긴 사용자 작업
OptimisticLockException 또는 영향받은 행 0개를 보고 재조회한다.
먼저 잠그고 다른 트랜잭션을 대기시키거나 실패시킨다.
충돌 빈도 높음, 손실 비용 큼, 짧은 DB 작업
FOR UPDATE, NOWAIT, SKIP LOCKED, timeout을 조합한다.
재고 차감은 조건부 update로 “잘못된 성공”을 먼저 막는다.
인덱스가 부실하면 잠금 범위가 커진다.
여러 테이블을 잠글 때 접근 순서를 맞춰 데드락을 줄인다.