- 트랜잭션의 성질 중, Isolation(격리성)을 보장하려면 트랜잭션이 순서대로 처리되어야 함
- 순서대로 처리하면 동시성 처리 성능이 떨어지므로 격리성 수준을 두어 관리
Read Uncommited
- 다른 트랜잭션이 commit하지 않은 데이터에 접근 가능
- Dirty Read, Non-repeatable Read, Phantom Read 발생
Dirty Read
- B 트랜잭션이 데이터를 변경후 커밋하지 않고 종료했다면, A 트랜잭션은 잘못된 데이터를 조회하게 됨
Read Commited
- Oracle, SQL Server 기본 격리성
- commit된 데이터만 조회 가능
- 해당 트랜잭션이 완료될 때까지, 조회한 모든 데이터에 shared lock이 걸려 데이터 변경을 방지함
- Non-repeatable Read, Phantom Read 발생
Non-repeatable Read
- 한 트랜잭션 내에서, 처음 조회했던 데이터를 다시 조회했는데 그 사이 다른 트랜잭션이 해당 데이터를 변경했다면 다른 데이터가 조회됨
- 정합성이 깨짐
Repeatable Read
- MySQL 기본 격리성
- 한번 조회한 데이터는, 해당 트랜잭션 내에서 다시 조회해도 같은 데이터가 조회됨
- 해당 트랜잭션이 완료될 때까지, 조회한 모든 데이터에 shared lock이 걸려 데이터 변경을 방지함
- 트랜잭션 도중 다른 트랜잭션의 INSERT를 허용함
- Phantom Read 발생
Phantom Read
- 한 트랜잭션 내에서, 처음 조회할때 조회되지 않았던 데이터가 두번째 조회에서 조회됨 (INSERT를 허용하므로)
- A 트랜잭션에서 특정 데이터를 조회했는데 B 트랜잭션에서 해당 데이터를 수정, 커밋했다면 A가 다시 조회했을때 최종 수정되기 이전의 데이터가 조회됨
Serializable
- 가장 엄격한 수준의 격리성
- 동시성 처리에 약함
- REPEATABLE READ와 마찬가지로 shared lock이 걸림