공유 스냅샷 + 커밋 판정
PostgreSQL의 REPEATABLE READ는 읽기를 고정하고, 충돌한 쓰기는 커밋에서 탈락시킵니다.
두 트랜잭션은 같은 시점의 데이터를 읽을 수 있지만, 같은 행을 서로 다른 값으로 바꾸려 하면 나중 커밋이 그대로 통과하지 않습니다.
공유 시작점
트랜잭션 시작 시점의 스냅샷을 끝까지 유지
그래서 T1과 T2 모두 처음에는 같은 값만 봅니다. 반복 읽기는 안정적이지만, 아직 충돌 판정은 끝나지 않았습니다.
읽은 원본 버전 100
같은 SELECT 결과
T1 SELECT balance100
T2 SELECT balance100
STEP 1
읽기
STEP 2
같은 원본을 기준으로 수정
STEP 3
커밋 시점에 충돌 판정
T1
스냅샷 읽기
잔고 100 확인
시작 시점 버전을 읽음
쓰기 시도
100 → 90
UPDATE account SET balance = 90
커밋 결과
COMMIT 성공
먼저 확정된 변경이 실제 상태가 됩니다.
T2
스냅샷 읽기
잔고 100 확인
T1과 같은 스냅샷을 봄
쓰기 시도
100 → 80
UPDATE account SET balance = 80
커밋 결과
serialization failure
COMMIT -> ERROR: could not serialize access
무엇이 보장되나
같은 트랜잭션 안의 읽기 결과는 처음 잡은 스냅샷 기준으로 유지됩니다.
왜 중요하나
충돌한 두 쓰기를 둘 다 반영하지 않고, 나중 커밋을 실패시켜 재시도를 요구합니다.