트랜잭션 격리 수준
동시에 여러 트랜잭션이 처리될 때, 특정 트랜잭션이 다른 트랜잭셕에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지 결정하는 것 (= 일관성 없는 데이터를 허용하도록 하는 수준)
필요성
트랜잭션의 ACID 특성을 보장하기 위함
Locking을 통해 해결할 수 있지만, 무조건 Locking으로 동시에 수행되는 수많은 트랜잭션을 순서대로 처리하게 되면 성능이 떨어지게 됨
반대로 느슨한 Locking은 데이터 무결성에 문제를 가져옴
효율적인 Locking의 사용을 위해 적절한 격리수준이 필요
종류
- Read Uncommitted (레벨 0)
트랜잭션 처리중이거나, 아직 commit되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용함
데이터베이스의 일관성을 유지하는 것이 불가능하기 때문에 Dirty Read가 발생함
- Read Committed (레벨 1)
트랜잭션이 수행되는 동안 다른 트랜잭션이 접근할 수 없어 대기하게 됨
한 트랜잭션의 변경내용이 commit되어야만 다른 트랜잭션에서 조회 가능
대부분의 RDBMS에서 기본적으로 사용하는 격리수준
Non-Repeatable Read가 발생할 수 있음
- Repeatable Read (레벨 2)
트랜잭션이 시작되기 전 commit된 내용에 대해서만 조회 가능
트랜잭션이 범위 내에서 조회한 데이터 내용이 항상 동일함을 보장함
Phantom Read가 발생할 수 있음
MySQL에서 기본으로 사용함
- Serializable (레벨 3)
다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정 및 입력 불가능
가장 단순하면서 엄격한 격리 수준이지만 처리성능이 가장 낮음
각 격리 레벨에 따라 발생하는 현상들
- Dirty Read
특정 트랜잭션에 의해 수정됐지만 아직 커밋되지 않은 데이터를 읽는 현상
- Non-Repeatable Read
한 트랜잭션 내에서 반복 읽기를 수행하면 다른 트랜잭션의 커밋 여부에 따라 조회 결과가 달라지는 현상
- Phantom Read
한 트랜잭션 내에서 같은 쿼리를 두번 수행 시, 첫번째 쿼리에는 없던 레코드가 두번째 쿼리에서 발생하는 현상
참고자료
트랜잭션 격리수준
Phantom Read
Non-Repeatable Read