Transaction Isolation Level
- 동시에 여러 트랜잭션이 처리될 때 트랜잭션끼리 얼마나 고립되어 있는지 나타낸 것
- 쉽게 말해 A트랜잭션에서 변경되거나 조회하는 데이터를 B 트랜잭션에서 볼 수 있도록 허용할지 말지를 결정하는 것이다
- 트랜잭션은 데이터의 정합성을 위해 원자성, 일관성, 격리성, 지속성(=ACID)를 보장한다. 이때 격리성을 완벽히 보장하면 트랜잭션을 차례대로 실행해야 해서 성능이 나빠지게 된다. 이러한 문제 때문에 ANSI 표준은 트랜잭션 격리 수준을 4단계로 나누어 정의하고 있다
낮은 Transaction Isolation Level에서 발생할 수 있는 문제들
- Dirty Read
- 변경 후 commit/rollback 되지 않은 값을 읽어온다
- Non-Repeatable Read
- 하나의 트랜잭션 안에서 여러 번의 SELECT를 수행할 때, 데이터가 동일하다고 보장해주지 않는다
- 왜냐하면 다른 트랜잭션에서 해당 데이터를 변경 후 commit 했을 경우 데이터가 변경되기 때문이다
- Phantom Read
- 하나의 트랜잭션 안에서 일정범위의 레코드를 두번 이상 읽을 때, 첫 번재 쿼리에는 없던 유령 레코드가 두번째 쿼리에서 나타나는 현상
- Lost Update
- 동일한 데이터를 두 트랜잭션에서 업테이트 하려고 할 때, 나중에 접근한 트랜잭션에서 발생한 update 때문에 먼저 접근한 update문이 실행되지 않는 문제
READ UNCOMMITTED [ Transaction Level 0 ]
- 다른 트랜잭션에서 변경된 내용이 commit/rollback 되기 전에 조회 가능
- Dirty Read, Non-Repeatable Read, Phantom Read 발생
- Dirty Read 문제 때문에 RDBMS 표준에서는 격리 수준으로 인정하지 않는다
READ COMMITTED [ Transaction Level 1 ]
- 다른 트랜잭션에서 변경 내용이 commit 되어야만 조회 가능
- 대부분의 RDBMS에서 기본적으로 사용하고 있다
- 실제 테이블 값을 가져오는게 아니라 undo 영역에 백업된 레코드에서 값을 가져온다
- undo 영역
- Rollback 시 이전 데이터로 복구할수 있도록 로깅 해놓은 영역
- undo 영역
- Non-Repeatable Read, Phantom Read가 발생 할 수 있다
REPEATABLE READ [ Transaction Level 2 ]
- 트랜잭션이 시작하기 전 마지막 commit된 데이터만 조회 가능
- Phantom Read 문제가 발생 할 수 있다
SERIALIZABLE [ Transaction Level 3 ]
- 읽기 작업에 공유 잠금을 설정해 다른 트랜잭션에서 해당 데이터를 변경하지 못하게 함
- Shared lock = S Lock = 공유 잠금
- 다른 트랜잭션에서 데이터를 읽을 수는 있지만 변경은 불가능하게 하는 것
- Exclusive lock = X Lock = 배타적 잠금
- 어떤 트랜잭션에서 데이터를 변경하고자 할 떄 해당 트랜잭션이 완료될 떄까지 해당 데이터를 다른 트랜잭션에서 읽거나 쓰지 못하게 함
- Shared lock = S Lock = 공유 잠금
- 가장 엄격한 격리 수준이지만 성능이 떨어져 거의 사용되지 않는다