PostgreSQL 18, Read Committed, 세션 두 개를 기준으로 보겠습니다. 보고 화면이 조건에 맞는 주문 12건을 셉니다. 다른 세션이 조건에 맞는 주문을 하나 넣고 커밋합니다. 그다음 화면이 첫 페이지를 가져옵니다.
SELECT마다 자기 문장이 시작될 때 스냅샷을 잡습니다. 그래서 합계는 이전 집합을 설명하고, 페이지에는 그사이 커밋된 주문이 들어갑니다. 두 SELECT를 트랜잭션으로 묶어도 달라지지 않습니다. Read Committed에서는 여전히 문장마다 새 스냅샷을 쓰기 때문입니다.
지키고 싶은 규칙은 좁습니다. 화면을 볼 즈음 더 새로운 주문이 있더라도 개수와 행은 같은 보고서를 설명해야 합니다. 그리고 두 값은 화면에 함께 표시됩니다.
두 읽기를 하나의 Repeatable Read 트랜잭션으로 감싸면 같은 스냅샷을 공유합니다. 하나로 합친 쿼리를 쓰면 한 번의 읽기가 됩니다. 어느 쪽이 이 규칙을 더 분명하게 드러냅니까?