Isolation Level
데이터베이스에서 여러 트랜잭션을 동시에 처리할 때, 특정 트랜잭션에서 수행하는 작업이 다른 트랜잭션에 얼마나 '보이는가'를 결정하는 것이다.
즉, 트랜잭션에서 일관성 없는 데이터를 허용하도록 하는 수준을 말한다.
Isolation Level의 필요성
여러 트랜잭션이 동시에 데이터베이스에 접근할 때 발생하는 문제를 해결하기 위해 Isolatino Level이 필요하다.
1. Dirty Read
- 한 트랜잭션이 아직 커밋되지 않은 다른 트랜잭션의 변경을 읽는 현상
- 이로 인해 트랜잭션의 실패로 롤백이 발생하더라도 이미 읽혀진 데이터가 원래의 값으로 돌아가지 않는 문제가 생긴다.
2. Non-Repeatable Read
- 같은 트랜잭션 내에서 같은 쿼리를 두 번 실행했을 때, 그 결과가 다르게 나타나는 현상
- 이는 한 트랜잭션이 진행 중 일 때, 다른 트랜잭션이 그 트랜잭션의 작업 영역을 변경하고 커밋하기 때문에 발생한다.
3. Phantom Read
- 한 트랜잭션 내에서 같은 쿼리를 두 번 실행했을 때, 첫 번째 쿼리에서 없던 행이 두 번째 쿼리에서 나타나는 현상
- 다른 트랜잭션이 새로운 행을 삽입하고 커밋했기 때문에 발생한다.
트랜잭션의 Isolation Level은 이러한 동시성 문제를 어느 정도까지 허용할 것인지를 결정한다. 이는 성능과 데이터의 일관성 사이의 균형을 찾는 것으로, 높은 격리 수준은 더 적은 동시성 문제를 발생시키지만, 반대로 성능이 떨어질 수 있다.
Isolation Level 종류
1. Read Uncommitted (레벨 0)
SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리지 않는 계층
트랜잭션에서 수행한 변경 사항이 커밋되기 전에 다른 트랜잭션에서 읽을 수 있다. 즉, 'Dirty Reads'가 허용된다.
여러 트랜잭션이 동시에 실행 될 수 있으며, 따라서 동시성 문제가 가장 많이 발생한다.
2. Read Committed (레벨 1)
SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리는 계층
커밋된 데이터만 다른 트랜잭션에서 읽을 수 있다. 즉, 'Dirty Reads'는 방지하지만 'Non-Repeatable Reads'와 'Phantom Reads'는 발생할 수 있다.
대부분의 데이터베이스 시스템의 기본 격리 수준이다.
3. Repeatable Read (레벨 2)
트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리는 계층
트랜잭션 동안 같은 데이터를 여러번 읽을 때 항상 동일한 결과를 반환한다. 즉, 'Dirty Reads'와 'Non-Repeatable Reads'는 방지하지만 'Phantom Reads'는 발생할 수 있다.
다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대해 수정할 수 없다.
MySQL에서 기본으로 사용하는 격리 수준이다.
4. Serializable (레벨 3)
트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리는 계층
트랜잭션을 순차적으로 실행하여 동시성 문제를 완전히 제거한다. 그러나 이 레벨은 성능에 부정적인 영향을 미칠 수 있다.
선택 시 고려사항
Isolation Level은 동시성과 데이터 무결성에 연관되어 있다.
동시성을 증가시키면 데이터 무결성에 문제가 발생하고, 데이터 무결성을 유지하면 동시성이 떨어지게 된다. 따라서 어플리케이션의 요구사항과 성능 사이의 트레이드오프를 고려해야 한다.
'Computer Science > Database' 카테고리의 다른 글
[Database] 저장 프로시저 (Stored PROCEDURE) (0) | 2023.07.25 |
---|---|
[Database] 레디스 (Redis) (0) | 2023.07.16 |
[Database] 트랜잭션 (Transaction) (0) | 2023.07.07 |
[Database] 정규화 (Normalization) (0) | 2023.07.07 |
[Database] 인덱스 (Index) (0) | 2023.06.30 |