Overview
Transaction Isolation Levels == 데이터베이스 트랜잭션 격리 수준(Transaction Isolation Levels)은 여러 트랜잭션이 동시에 실행될 때, 한 트랜잭션이 다른 트랜잭션의 변경 사항을 얼마나 볼 수 있도록 허용할지 정의하는 기준입니다. 이는 데이터의 일관성과 동시성 간의 균형을 맞추는 데 중요한 역할을 합니다. ANSI/ISO SQL 표준에서는 네 가지 주요 격리 수준을 정의하고 있으며, 각 수준은 특정 동시성 문제(Anomaly)를 방지합니다.
여러 트랜잭션이 동시에 실행될 때 특정 트랜잭션이 다른 트랜잭션의 변경 사항을 얼마나 참조할 수 있도록 허용할지 정의하는 기준 데이터의 일관성과 동시성을 위함 ANSI/ISO SQL표준에서 네 가지 주요 격리 수준을 정의하며, 각 수준은 특정 동시성에 대해 이상현상을 방지
Types
1. READ_UNCOMMITTED
- 설명: 가장 낮은 격리 수준입니다. 트랜잭션이 커밋되지 않은 다른 트랜잭션의 변경 사항을 읽는 것을 허용합니다.
- 방지하는 동시성 문제: 없음 (모든 동시성 문제가 발생할 수 있습니다.)
- 발생 가능한 문제: Dirty Read, Non-Repeatable Read, Phantom Read
- 성능: 가장 빠르지만, 데이터 일관성이 매우 낮습니다.
2. READ_COMMITTED
- 설명: 커밋된 데이터만 읽을 수 있도록 허용합니다. 다른 트랜잭션이 변경했지만 아직 커밋되지 않은 데이터는 읽을 수 없습니다.
- 방지하는 동시성 문제: Dirty Read
- 발생 가능한 문제: Non-Repeatable Read, Phantom Read
- 성능:
READ_UNCOMMITTED보다 느리지만, 대부분의 상업용 데이터베이스 시스템의 기본 격리 수준으로 사용됩니다.
3. REPEATABLE_READ
- 설명: 트랜잭션 내에서 한 번 읽은 데이터는 트랜잭션이 종료될 때까지 다른 트랜잭션에 의해 변경되거나 삭제될 수 없습니다. 즉, 같은 쿼리를 여러 번 실행해도 항상 동일한 결과를 보장합니다.
- 방지하는 동시성 문제: Dirty Read, Non-Repeatable Read
- 발생 가능한 문제: Phantom Read
- 성능:
READ_COMMITTED보다 느리며, MySQL의 InnoDB 스토리지 엔진의 기본 격리 수준입니다. 팬텀 읽기를 방지하기 위해 넥스트 키 락(Next-Key Locking)과 같은 잠금 전략을 사용하기도 합니다.
4. SERIALIZABLE
- 설명: 가장 높은 격리 수준입니다. 트랜잭션을 순차적으로 실행하는 것과 동일한 효과를 냅니다. 즉, 동시성 문제를 완전히 방지합니다.
- 방지하는 동시성 문제: Dirty Read, Non-Repeatable Read, Phantom Read (모든 동시성 문제 방지)
- 발생 가능한 문제: 없음
- 성능: 가장 느리지만, 데이터 일관성이 가장 높습니다. 동시성이 중요한 환경에서는 성능 저하를 유발할 수 있으므로 신중하게 사용해야 합니다.
Why
왜 이런것들을 나눠놨을까? 트랜잭션 격리수준을 이해하기위해 발생할 수 있는 동시성 문제를 알아야 함
Concurrency Anomlies
동시성이란? ==
- Dirty Read:
- 하나의 트랜잭션이 아직 커밋되지 않은 다른 트랜잭션의 데이터를 읽을수 있는 수준을 의미 만약 변경사항을 일으킨 트랜잭션이 롤백되는경우, 읽었던 데이터는 유효하지 않은 무효한 데이터가 됨
- Non-Repeatble Read:
- 하나의 트랜잭션 내에서 같은 쿼리를 두번 실행는경우, 그리고 그 사이에 다른트랜잭션이 데이터를 수정하고 커밋해 두 쿼리의 결과가 다르게 나타나는 현상 예시) 트랜잭션 A가 1번 레코드를 읽고, 트랜잭션 B가 1번 레코드에 대해 수정(및 커밋)후 트랜잭션 A가 다시 같은행을 읽었을 때 다른 값을 얻는 경우를 의미
- Phantom Read:
- 하나의 트랜잭션에서 같은 쿼리를 두번 실행했을 때, 첫번째 쿼리에서는 없던
트랜잭션 동시성 문제 (Transaction Concurrency Anomalies)
트랜잭션 격리 수준을 이해하기 위해서는 먼저 발생할 수 있는 동시성 문제들을 알아야 합니다.
- Dirty Read (더티 읽기):
- 하나의 트랜잭션이 아직 커밋되지 않은 다른 트랜잭션의 데이터를 읽는 현상입니다.
- 만약 변경사항을 일으킨 트랜잭션이 롤백되면, 읽었던 데이터는 유효하지 않은(무효한) 데이터가 됩니다.
- Non-Repeatable Read (반복 불가능 읽기):
- 하나의 트랜잭션 내에서 같은 쿼리를 두 번 실행했을 때, 그 사이에 다른 트랜잭션이 데이터를 수정하고 커밋하여 두 쿼리의 결과가 다르게 나타나는 현상입니다.
- 예를 들어, 트랜잭션 A가 특정 행을 읽고, 트랜잭션 B가 해당 행을 업데이트하고 커밋한 후, 트랜잭션 A가 다시 같은 행을 읽었을 때 다른 값을 얻는 경우입니다.
- Phantom Read (팬텀 읽기):
- 하나의 트랜잭션 내에서 같은 쿼리를 두 번 실행했을 때, 첫 번째 쿼리에서는 없던 유령(Phantom) 레코드가 두 번째 쿼리에서 나타나는 현상입니다.
- 이는 주로
INSERT또는DELETE작업 때문에 발생합니다. 예를 들어, 트랜잭션 A가 특정 조건의 행들을 조회하고, 트랜잭션 B가 해당 조건에 맞는 새로운 행을 삽입하고 커밋한 후, 트랜잭션 A가 다시 같은 조건으로 조회했을 때 새로운 행이 나타나는 경우입니다.
트랜잭션 격리 수준 종류 (Types of Transaction Isolation Levels)
각 격리 수준별 문제 방지 표
| 격리 수준 | Dirty Read 방지 | Non-Repeatable Read 방지 | Phantom Read 방지 |
|---|---|---|---|
| READ_UNCOMMITTED | X | X | X |
| READ_COMMITTED | O | X | X |
| REPEATABLE_READ | O | O | X |
| SERIALIZABLE | O | O | O |
결론 (Conclusion)
트랜잭션 격리 수준은 데이터베이스 애플리케이션의 요구사항에 따라 신중하게 선택되어야 합니다. 높은 격리 수준은 데이터 일관성을 보장하지만, 동시성과 성능 저하를 가져올 수 있습니다. 반대로 낮은 격리 수준은 성능을 향상시키지만, 데이터 불일치를 초래할 위험이 있습니다. 따라서 애플리케이션의 특성과 요구되는 데이터 무결성 수준을 고려하여 적절한 격리 수준을 선택하는 것이 중요합니다.