이번 포스트를 보기 앞서 이전 포스트를 보고 오시기 바랍니다.
https://jaystorage.tistory.com/28
Isolation Level 이란?
트랜잭션의 격리 수준(Isolation Level)이란 여러 트랜잭션이 동시에 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터에 접근할 수 있게 허용할지 여부를 결정하는 것을 의미한다.
이러한 Isolation Level 등장하게 된 이유는 다음과 같다.
트랜잭션의 ACID 원칙(원자성, 일관성, 고립성, 지속성)을 모두 엄격하게 지키면 동시성 성능(DB에서 동시에 여러 트랜잭션을 효율적으로 처리할 수 있는 능력)이 저하된다. 따라서 트랜잭션 격리 수준을 나누어 ACID 특성을 적절히 조정하면 성능을 향상시키면서도 필요한 수준의 데이터 일관성을 유지할 수 있다.
Isolation Level 이 잘 지켜지지 않을 때 발생할 수 있는 문제
부정 판독(Dirty Read)
- commit 되지 않은 데이터를 읽어서 발생하는 문제
[예시]
1) Transaction A에서 row를 insert (commit은 안 한 상태)
2) Transaction B가 아직 commit 되지 않은 해당 row를 읽음
3) Transaction A가 rollback 됨
이 경우 Transaction B는 실제로 DB에 한 번도 commit 되지 않은, 존재하지 않는 데이터를 읽음
비반복 판독(Nonrepeatable Read)
- commit된 데이터가 다른 트랜잭션에 의해 수정되어 동일한 트랜잭션 내에서 두 번 읽었을 때 값이 달라지는 문제
[예시]
* Transaction A에 동일한 select 쿼리가 2번 있다고 가정
1) Transaction A의 첫번째 select 문에서 특정 row를 읽음
2) Transaction B가 해당 row를 update 함
3) Transaction A의 두번째 select 문에서 해당 row를 다시 읽음
이 경우 Transaction A의 select 문은 동일한 row를 읽었으니 매번 상태가 같아야 함. 하지만 Transaction B의 간섭으로 인해 Transaction A의 결과가 달라짐
가상 판독(Phantom Read)
- 특정 범위 값을 읽고 나서 다시 읽었을 때 기존에 없던 새로운 row가 읽히는 문제
[예시]
* Transaction A에 동일한 select 쿼리가 2번 있다고 가정
1) Transaction A의 첫번째 select 문에서 특정 범위의 데이터를 읽음
2) Transaction B가 1)의 select 문 조건에 걸릴 수 있는 새로운 row를 insert 함
3) Transaction A의 두번째 select 문에서 특정 범위의 데이터를 다시 읽음
이 경우 Transaction A의 select 문은 동일한 범위의 데이터를 읽었으니 매번 상태가 같아야 함.
하지만 Transaction B의 간섭으로 인해 Transaction A의 2번째 select 문에서 갑자기 없던 row가 잡힘
Isolation Level 유형
1. Read Uncommitted
- 트랜잭션이 commit되지 않은 데이터를 읽을 수 있음
- 가장 낮은 격리 수준으로, 부정 판독(Dirty Read), 비반복 판독(Nonrepeatable Read), 가상 판독(Phantom Read) 등의 문제가 발생할 수 있음
2. Read Committed
- 트랜잭션이 commit된 데이터만 읽을 수 있음
- 부정 판독(Dirty Read)을 방지하지만, 비반복 판독(Nonrepeatable Read)과 가상 판독(Phantom Read)은 발생할 수 있음
* 대부분의 DB에서 사용하는 Default Isolation Level
3. Repeatable Read
- 트랜잭션이 데이터를 두 번 이상 읽을 때, 항상 동일한 결과를 반환함
- 부정 판독(Dirty Read)과 비반복 판독(Nonrepeatable Read)을 방지하지만, 가상 판독(Phantom Read)은 발생할 수 있음
4. Serializable
- 트랜잭션을 완전히 직렬화하여 실행함. 즉, 모든 트랜잭션이 순차적으로 실행됨으로써 동시성 문제가 완전히 방지됨.
- 가장 높은 격리 수준으로, 부정 판독(Dirty Read), 비반복 판독(Nonrepeatable Read), 가상 판독(Phantom Read) 모두 방지됨
출처 : https://needjarvis.tistory.com/161 https://mangkyu.tistory.com/299 https://suhwan.dev/2019/06/09/transaction-isolation-level-and-lock/ |
'DB' 카테고리의 다른 글
정규화(Normalization) (2) | 2024.10.07 |
---|---|
DB Lock (0) | 2024.07.10 |
DB Transaction (0) | 2024.07.08 |
DB INDEX (1) | 2023.09.17 |