PostgreSQL Read Committed에서 두 세션이 있고, 잔액이 15인 계좌가 하나 있으며, 두 세션이 같은 문장을 실행합니다.
UPDATE accounts
SET balance = balance - 10
WHERE id = 1 AND balance >= 10;
세션 A가 행을 갱신했고 아직 커밋하지 않았습니다. 세션 B는 그 행을 찾고, 갱신 중임을 보고 기다립니다. A가 커밋합니다. B는 처음 찾은 버전에 변경을 적용하지 않습니다. 갱신된 버전을 가져와 WHERE 절을 다시 평가하고, 잔액이 5인 것을 보고 아무것도 갱신하지 않습니다. 잔액은 음수가 되지 않고, B가 돌려준 영향받은 행 수 0이 호출한 쪽에 출금이 일어나지 않았음을 알려 줍니다.
문서는 이 재확인을 UPDATE, DELETE, SELECT FOR UPDATE에 대해 설명하고, 어디서부터 도움이 되지 않는지도 적어 둡니다. 재확인은 대상 행에만 적용됩니다. 하위 질의나 조인으로 다른 행을 읽는 조건은 그 행들의 새 버전으로 다시 평가되지 않으므로, 그런 문장은 여러 상태가 섞인 것을 보고 동작할 수 있습니다. 문서에 실린 예는 동시에 실행되는 UPDATE가 바꾸고 있는 값을 WHERE로 찾는 DELETE이고, 조건에 맞는 행이 갱신 전에도 후에도 있는데 아무것도 지우지 못한 채 끝납니다.
따라서 WHERE에 둔 단일 행 조건은 Read Committed에서도 지켜집니다. 둘째 테이블을 보는 조건이라면 저는 행 잠금이나 더 강한 격리 수준을 쓰겠습니다.