트랜잭션A와 트랜잭션B가 동시에 수행되고 있다. 트랜잭션A에서 홍길동의 이름을 홍길동2로 변경하였고 commit/rollback을 하지 않았지만 트랜잭션B에서는 변경된 홍길동2의 데이터가 조회되는 것을 확인할 수 있다. 만약 사진처럼 트랜잭션A가 rollback으로 종료하게 된다면 트랜잭션B는 잘못된 값을 가지고 있는 것이기 때문에 정합성에 문제를 발생시킬 수 있다.
커밋한 트랜잭션의 데이터 변경만을 다른 트랜잭션에서 읽을 수 있도록 허용하는 것을 말한다. Oracle DB에서 Default로 사용되는 격리 수준이다.
이전과 다르게 커밋되기 전에는 이전 값인 홍길동이 그대로 출력이 되고 커밋된 이후에는 홍길동2가 나타나 dirty read가 해결된 것을 확인할 수 있다. 문제는 트랜잭션B 내에서 트랜잭션A의 커밋 전/후로 다른 데이터가 조회된다는 것이다.
트랜잭션 범위 내에서 조회한 데이터는 항상 동일한 데이터를 읽을 수 있도록 허용하는 것을 말한다. Mysql InnoDB에서 Default로 사용되는 격리 수준이다.
여기서는 이전까지 발생했던 dirty read, non-reapeatable read 문제는 나타나지 않는다. 하지만 이전에 조회했던 테이블에 값이 추가된다면 조회된 데이터의 불일치를 다시 발생하게 된다.
한 트랜잭션에서 사용하고 있는 데이터는 다른 트랜잭션에서 접근할 수 없는 것을 말한다.