이번엔 READ COMMITED 레벨을 보겠다. 이전 실습과 마찬가지로 아래와 같은 상태에서 출발한다.
이전 실습 때처럼 T2에서 100을 200으로 수정하고
T1에서 확인해보면
이번엔 100이 초기 상태와 동일하게 그대로 100으로 보이는 것을 알 수 있다. T2의 작업 내용이 반영되지 않았다! T1의 첫 SELECT 문이 참조하던 스냅샷을 그대로 다음 SELECT 문이 참조하고 있기 때문이다. 이렇게 T2에서 변경된 값이 T1에서 조회되려면 T2가 COMMIT까지 되어야 한다. 레벨의 이름 그대로 READ COMMITTED (DATA)하기 때문이다. 이 부분은 마지막에 확인하기로 하고, 일단은 T2에서 발생한 값의 변경은 T1의 고립 환경에 영향을 주지 못했다는 점을 기억하자. 이것은 READ UNCOMMITTED 레벨에 존재하던 Dirty Read 문제가 해결된 것이다.
이제 T2를 커밋하자.
T1에서 다시 확인해보면,
이제는 200이 잘 확인되는 것을 알 수 있다. 말 그대로 READ COMMITED (Data)인 것이다.
아직 T1은 마무리하지 말고 다른 T2에서 이번엔 row 하나를 추가해보자.
T1에서 확인을 해보면
새로 추가된 row가 보이지 않는다.
T2를 커밋하고
다시 확인해보면,
이번에도 역시 T2가 커밋까지 했기 때문에 추가된 row가 잘 보인다. 그런데 이렇게 T1이 트랜잭션 도중에 이전 SELECT 문에는 등장하지 않았지만 이후 SELECT 문에서 등장하는 row를 Phantom row라고 한다.
READ COMMITED 레벨은 READ UNCOMMITED 레벨 때에 비해 다른 트랜잭션(T2)의 아직 커밋조차 되지 않은 데이터는 보이지 않는다는 점에서 고립성이 좀더 강화됐다고 볼 수 있지만 T2 커밋 후에는 역시 변화된 데이터를 볼 수 있다. 이때 갑자기 등장하는 새로운 row가 있는 경우, 이를 Phantom row라고 한다는 사실을 잘 기억하자.