트랜잭션 격리수준
undo log와 트랜잭션 격리수준에 따른 동시성 제어에 대해서 알아보자
isolation level(격리수준)
- ✅ 트랜잭션 격리수준(isolation level)이란 동시에 여러 트랜잭션이 처리될 때, 트랜잭션끼리 얼마나 고립되어 있는지를 나타내는 수준
- 특정 트랜잭션이 다른 트랜잭션에 변경한 데이터를 볼 수 있도록 허용할지 말지를 결정하는 수준을 의미
- 즉, 특정 트랜잭션에서 다른 트랜잭션 데이터를 볼 때 undo log를 읽을 지, Disk에 적힌 데이터를 읽을지 달라진다.
- READ UNCOMMITTED
- READ COMMITED
- REPEATABLE READ
- SERIALIZABLE
- READ UNCOMMITTED에서 SERIALIZABLE로 갈수록 고립성이 높아지지만, 동시성이 저하됨
- ORACLE = READ COMMITTED , mysql = REPEATABLE READ
트랜잭션 격리수준 관련 부정합 문제
트랜잭션 격리수준에 대해서 알아보기 전에 트랜잭션의 격리수준에 따른 부정합 문제를 먼저 확인이 필요합니다.
1. Dirty Read
- Dirty Read는 다른 트랜잭션에 의해 수정되었지만 아직 commit되지 않은 데이터를 읽는 것을 의미
2. Non-Repeatable Read
- Non-Repeatable Read는 한 트랜잭션 내에서 같은 Key를 가진 Row를 2번 읽었는데 그 사이에 값이 변경되거나 삭제되어 결과가 다르게 나타나는 현상
3. Phantom Read
- Phantom Read는 한 트랜잭션 내에서 같은 쿼리를 두 번 실행했는데, 첫 번째 쿼리에서 없던 유령레코드가 2번째 쿼리에서 나타나는 현상
트랜잭션 격리수준
READ UNCOMMITTED
- READ UNCOMMITTED는 각 트랜잭션에서의 변경 내용이 COMMIT, ROLLBACK여부에 상관없이 다른 트랜잭션에서 관여 가능
- 정합성에 문제가 많아 사용하지 않는 것을 권함
- Dirty Read, Non-Repeatable Read, Phantom Read 발생
READ COMMITTED
- 트랜잭션에서 commit되어 확정된 데이터만 다른 트랜잭션이 읽도록 허용
- 이 때, commit되지 않은 데이터에 대해서는 undo log에 있는 이전 데이터를 가져옴
- Non-Repeatable Read, Phantom Read 발생
- 트랜잭션-1이 Commit한 이후 아직 끝나지 않는 트랜잭션-2가 다시 테이블 값을 읽으면 값이 변경됨
Repeatable Read
- 트랜잭션 내에서 삭제, 변경에 대해서 undo로그에 넣어두고 앞서 발생한 트랜잭션에 대해서는 실제 데이터가 아닌 Undo로그에 있는 백업데이터를 읽음
- MySQL에서는 트랜잭션마다 트랜잭션 ID를 부여하여 트랜잭션 ID보다 작은 트랜재션 번호에서 변경한 것만 읽음
- Phantom Read발생
Serialzable Read
- 트랜잭션 내에서 쿼리를 두 번 이상 수행 시, 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 사라지지 않으며, 새로운 레코드가 나타나지 않음
참조
https://sabarada.tistory.com/117
https://nesoy.github.io/articles/2019-05/Database-Transaction-isolation