자료조사 중에 이 움짤을 봤는데 격리 수준 차이에 따른 진행을 잘 보여주어서 가져왔다.
트랜잭션 격리 수준(Transaction Isolation Level)이란 동시에 여러 트랜잭션이 처리 될 때, 트랜잭션끼리 얼마나 고립되어 있는가를 나타내는 정도다.
레벨(고립도)이 높아질수록 고립도가 올라가서 더 확실한 처리가 가능해지지만 동시에 수행될 수 있는 트랜잭션을 순서대로 처리하게 되어 속도가 느려지게 된다.
ANSI/ISO SQL 표준(SQL92)에서 정의한 4가지 트랜잭션 격리성 수준을 기준으로 설명한다.
트랜잭션에서 처리 중인 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다.
SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리지 않는다.
트랜잭션이 커밋되어 확정된 데이터만 다른 트랜잭션이 읽도록 허용한다.
Dirty Read를 방지해주지만 Non-Repeatable Read와 Phantom Read 현상은 막지 못한다.
그러므로 읽는 시점에 따라 결과가 다를 수 있다.
SELECT 문장이 수행되는 동안 해당 데이터에만 Shared Lock이 걸린다.
MVCC를 사용하여 구현한다.
트랜잭션 내에서 쿼리를 두 번 이상 수행할 때, 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌는 현상을 방지해 준다.
다만 Phantom Read 현상을 막지는 못해서, 첫 번째 쿼리에서 없던 새로운 레코드가 나타날 수 있다.
트랜잭션이 완료될 때까지 SELECT 문장이 사용되는 모든 데이터에 Shared Lock이 걸린다.
다른 사용자는 트랜잭션 영역에 해당하는 데이터에 대한 수정이 불가능하다.
트랜잭션 내에서 쿼리를 두 번 이상 수행할 때, 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌지 않음은 물론 새로운 레코드가 나타나지도 않는다.
트랜잭션이 완료될 때까지 SELECT 문장이 사용되는 모든 데이터에 Shared Lock이 걸린다.
다른 사용자는 트랜잭션 영역에 해당하는 데이터에 대한 수정 및 입력이 불가능하다.
다른 트랜잭션에 의해 수정됐지만 아직 커밋되지 않은 데이터를 읽는 것을 말한다.
커밋되지 않은 값을 읽었지만, 변경을 가한 트랜잭션이 롤백된다면 비일관성을 가지게 된다.
한 트랜잭션 내에서 같은 쿼리를 두 번 수행했을때, 두 쿼리의 결과가 상이하게 나타나는 비일관성 현상이다.
한 트랜잭션이 수행 중 일때 다른 트랜잭션이 값을 수정 또는 삭제하면 발생한다.
한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 첫 번째 쿼리에서 없던 유령(Phantom) 레코드가 두 번째 쿼리에서 나타나는 현상을 말한다.
한 트랜잭션이 수행 중일 때 다른 트랜잭션이 새로운 레코드를 추가 함으로써 나타난다.
Isolation Level | Dirty Read | Non-Repeatable Read | Phantom Read |
---|---|---|---|
Read Uncommitted | ⭕ | ⭕ | ⭕ |
Read Committed | ❌ | ⭕ | ⭕ |
Repeatable Read | ❌ | ❌ | ⭕ |
Serializable Read | ❌ | ❌ | ❌ |