자, Transaction Isolation 레벨을 하나씩 실습을 통해 이해해보자. 일단 다음과 같은 간단한 테이블(이름 : sample)이 있다고 해보자.
여기서 두 개의 터미널을 열고 각각 하나씩 트랜잭션을 수행할 것이다. 트랜잭션은 각각 T1(하얀색 터미널), T2(까만 터미널)라고 부르겠다.
READ UNCOMMITED 레벨에서 T1을 수행해보겠다.
간단하게 조회를 해보면
잘 조회가 된다. 자, 이제 T2를 시작해보자. T2는 별도로 Transaction Isolation 레벨을 설정하지 않고 기본 레벨인 REPEATABLE READ를 사용하겠다. 지금 중요한 것은 T1의 레벨이지, T2의 레벨은 아니다.
여기서 잠깐, count 값을 200으로 수정해보자.
과연 이 변경사항은 T1에서도 볼 수 있을까?
볼 수 있다! 왜냐하면 현재 레벨이 READ UNCOMMITED이기 때문이다. T2에서 아직 COMMIT하지 않은 중간 과정의 데이터 변화도 모두 T1이 읽을 수 있는 것이다. 이렇게 다른 트랜잭션에 의해 변화된 데이터를 읽는 것을 Dirty Read라고 한다. 이 데이터는 아직 커밋되지 않은 데이터라서 언제 중간에 다시 바뀌거나 사라지게 될지 모르기 때문에 이런 데이터에 의존하는 것은 사실 좋지 않다.
이번엔 row를 한번 추가해보자.
(원래는 12 대신 2가 들어가야 자연스럽다 ㅎㅎ, row 추가/삭제를 반복하다보니..)
다시 T1에서 조회를 해보면
역시 잘 보이는 것을 알 수 있다. 두 트랜잭션 다 Commit을 해서 완료하자.
자, READ UNCOMMITED 레벨이 실감되는가? T1에서는 T2에 의한 모든 데이터 변화를 SELECT로 읽어낼 수 있다. 이렇게 READ UNCOMMITED는 가장 낮은 수준의 고립화 레벨이다.