version 조건이 두 번째 변경의 lost update를 막는다

두 요청이 같은 version을 읽어도 먼저 성공한 UPDATE만 version을 증가시키고 늦은 요청은 0 row conflict로 드러난다.

Request A · 먼저 완료
READ

version = 3

현재 게시글 snapshot을 읽는다.

UPDATE

WHERE version = 3

1 row를 바꾸고 version을 4로 올린다.

RESULT

성공

새 상태 version 4를 반환한다.

Request B · 늦게 완료
READ

version = 3

A와 같은 snapshot에서 시작한다.

UPDATE

WHERE version = 3

DB row는 이미 version 4라 일치하지 않는다.

RESULT

0 row conflict

덮어쓰지 않고 재조회 또는 409를 선택한다.

핵심: 낙관적 잠금의 신호는 예외가 아니라 조건부 UPDATE가 변경한 row 수다.