존재하지 않을 수도 있는 값을 읽으므로 일반 업무에는 거의 피한다.
격리 수준은 표준 표와 DBMS 구현을 분리해서 읽는다
READ COMMITTED, REPEATABLE READ 같은 이름은 같아도 MVCC 스냅샷, 잠금 읽기, 충돌 실패 방식에 따라 실제 동작이 달라진다. 그래서 먼저 표준 이상 현상을 보고, 그다음 제품별 구현과 UPDATE 패턴을 확인한다.
표준 표는 “무엇을 막는가”를 빠르게 보는 기준이다
SQL isolation levels웹 트랜잭션 기본값으로 흔하지만, 재조회 일관성은 보장하지 않는다.
스냅샷이 직렬 실행과 항상 같은 뜻은 아니므로 write skew를 확인한다.
정확성은 강하지만 대기, abort, serialization failure 재시도가 필요하다.
같은 이름이라도 구현 방식이 실제 체감을 바꾼다
MVCC / lock / SSIPostgreSQL의 REPEATABLE READ는 snapshot isolation에 가깝다. 팬텀처럼 보이는 일반 SELECT 변화는 줄지만, 모든 직렬화 이상을 막으려면 SERIALIZABLE을 검토한다.
일반 SELECT는 스냅샷을 보고, SELECT ... FOR UPDATE나
범위 UPDATE는 next-key lock으로 새 행 진입을 막을 수 있다.
Lost update는 이상 현상 표와 분리해서 UPDATE 패턴으로 판단한다
read -> compute -> write is the risky shape
SELECT balance로 읽고 애플리케이션에서 계산한 뒤
UPDATE balance = 새값처럼 절대값을 저장하면 다른
트랜잭션의 변경을 덮을 수 있다.
SET balance = balance + 10처럼 DB 안에서 계산한다.
읽은 행을 잠그고 갱신을 직렬화한다.
WHERE id=? AND version=?로 충돌을 감지하고
재시도한다.