다른 트랜잭션이 같은 행을 수정하려면 먼저 기다려야 합니다.
SELECT stock
FROM products
WHERE id = 1
FOR UPDATE;
두 방식 모두 데이터 일관성은 지키지만, 하나는 먼저 잠그고 다른 하나는 끝에서 버전을 확인합니다.
version 이 그대로일 때만 UPDATE가 성공합니다.
대기 시간이 생기지만, 충돌 자체는 앞단에서 줄어듭니다.
읽기 동시성은 좋지만, 늦게 온 쪽은 재시도가 필요할 수 있습니다.
다른 트랜잭션이 같은 행을 수정하려면 먼저 기다려야 합니다.
읽을 때는 막지 않고, 쓰기 직전에 내가 본 버전이 아직 유효한지 확인합니다.
version=5 를 읽음version=6 으로 변경좌석 배정, 재고 마감처럼 같은 행을 자주 두고 경쟁하는 경우에 유리합니다.
게시글 수정, 설정 변경처럼 대부분은 바로 성공하고 가끔만 재시도해도 되는 경우에 적합합니다.
즉시 충돌을 막아야 하면 비관적, 대기보다 동시 처리가 더 중요하고 @Version 기반 재시도가 가능하면 낙관적 잠금을 선택합니다.