UPDATE ... WHERE version = 5커밋 직전 검사
버전이 바뀌었으면 반영하지 않고 재시도합니다.
두 방식 모두 정합성은 지키지만, 충돌을 미리 막을지 아니면 마지막 쓰기 순간에 검출할지 에서 차이가 납니다.
읽는 동안 잠금을 오래 잡지 않습니다.
충돌 가능성이 높다고 보고 대기를 허용합니다.
UPDATE ... WHERE version = 5커밋 직전 검사
버전이 바뀌었으면 반영하지 않고 재시도합니다.
SELECT ... FOR UPDATE작업 시작 전에 차단
같은 행에 접근한 다른 트랜잭션은 잠금 해제까지 대기합니다.
마지막 저장 순간에만 충돌 여부가 드러납니다.
정합성은 단순하지만, 대기열이 길어지면 처리량이 떨어집니다.
게시글 수정, 설정 변경처럼 대부분 바로 성공하는 흐름.
재고 차감, 계좌 잔액 변경처럼 같은 행을 자주 건드리는 흐름.
대기 시간은 적지만, 충돌 순간에는 사용자나 서비스가 다시 처리해야 합니다.
실패를 줄이는 대신, 잠금 시간이 길면 전체 흐름이 막힐 수 있습니다.
충돌이 드물면 낙관적 으로 동시성을 살리고, 충돌이 자주 나면 비관적 으로 순서를 강제해 일관성을 단순하게 관리합니다.