CAS 규칙

읽을 때 본 version이 그대로일 때만 갱신한다

낙관적 잠금은 먼저 잠그지 않습니다. 대신 내가 읽은 버전이 아직 유효한지를 `WHERE version = 5`로 확인하고, 맞으면 쓰고 틀리면 바로 실패를 돌려줍니다.

시작 상태
balance
100만원
version
5

애플리케이션은 이 값을 읽고, `version = 5`라는 전제를 붙여 갱신을 시도합니다.

조건부 UPDATE
UPDATE accounts
SET balance = 90,
    version = version + 1
WHERE id = 1
  AND version = 5;
검사

현재 version도 5인가? 이 조건이 참일 때만 한 행이 갱신됩니다.

성공: 내가 본 상태가 아직 최신

1 row updated
  • balance100 → 90
  • version5 → 6

행 하나가 바뀌었다면, 이번 트랜잭션이 정상적으로 커밋 후보가 됩니다.

실패: 다른 트랜잭션이 먼저 수정

0 rows updated
  • 현재 version이미 6 이상으로 바뀜
  • 내 요청`version = 5` 조건이 거짓이라 적용 안 됨
의미: 잠금 대기 대신 충돌을 즉시 감지했습니다. 값을 다시 읽고 재계산한 뒤 재시도해야 합니다.