트랜젝션의 격리 레벨
데이터베이스 트랜잭션(Transaction)은 데이터 무결성(Data Integrity)을 보장하기 위해 설계된 개념이다. 그러나 모든 트랜잭션의 완전한 독립성을 보장하면 성능 문제가 발생할 수 있다. 따라서 DBMS에서는 격리 수준(Isolation Level)이라는 개념을 도입하여 동시성과 성능 간 균형을 맞추고 있다.
왜 격리 수준을 조정할까?
격리 수준은 트랜잭션 간 격리 정도를 정의하며, 성능과 데이터 정합성 간의 균형을 조정한다.
- 성능 최적화: 높은 격리 수준은 데이터 무결성을 보장하지만, 동시성이 감소해 성능 저하를 초래할 수 있다.
- 격리 수준의 다양성: 각 격리 수준은 특정 상황에서 발생할 수 있는 문제를 해결하기 위해 정의된다.
격리 수준의 유형과 특징
격리 수준은 느슨한 격리부터 엄격한 격리까지 4단계로 나누어진다. 아래는 각 격리 수준에서 발생할 수 있는 문제와 이를 해결하기 위한 메커니즘을 설명한다.
1. Read Uncommitted (읽기 미완료)
특징
- Dirty Read 발생: 커밋되지 않은 데이터를 읽을 수 있음.
- Non-Repeatable Read와 Phantom Read도 발생 가능.
- 성능이 가장 뛰어나지만 데이터 정합성이 거의 보장되지 않음.
- 주로 정합성이 덜 중요한 로그 분석, 통계 계산 등에서 사용.
예시
트랜잭션 T1이 A = 100인 데이터를 A = 200으로 수정 중일 때, 트랜잭션 T2가 이 변경 중인 데이터를 읽어 A = 200으로 처리한다. 이후 T1이 롤백하면 T2는 잘못된 데이터를 기반으로 작업하게 된다.
2. Read Committed (읽기 커밋 완료)
특징
- Dirty Read 방지: 커밋된 데이터만 읽음.
- Non-Repeatable Read와 Phantom Read는 여전히 발생 가능.
- 가장 일반적으로 사용되는 격리 수준.
- MySQL(InnoDB)와 PostgreSQL의 기본 격리 수준.
예시
트랜잭션 T1이 데이터를 읽었을 때 A = 100이다. 이후 트랜잭션 T2가 A = 200으로 값을 업데이트하고 커밋한 후, T1이 다시 데이터를 조회하면 A = 200이 반환된다. 같은 트랜잭션 내에서 데이터의 값이 다를 수 있다.
3. Repeatable Read (반복 읽기)
특징
- Dirty Read와 Non-Repeatable Read 방지.
- Phantom Read는 여전히 발생 가능하지만 MVCC를 통해 이를 대부분 완화.
- 데이터 정합성이 중요하면서도 성능을 고려해야 하는 경우 적합.
- MySQL(InnoDB)에서 기본 격리 수준.
예시
트랜잭션 T1이 A = 100인 데이터를 읽는다. 이후 트랜잭션 T2가 A = 200으로 업데이트한 후 커밋하더라도, T1이 다시 데이터를 조회하면 여전히 A = 100이 반환된다. 하지만 T2가 새로운 데이터를 삽입한 경우, T1이 같은 조건으로 다시 데이터를 조회하면 새 데이터가 포함될 수 있다(Phantom Read).
4. Serializable (직렬화)
특징
- Dirty Read, Non-Repeatable Read, Phantom Read 모두 방지.
- 트랜잭션 간 충돌을 완전히 차단해 ACID 보장을 극대화.
- 가장 엄격한 격리 수준으로, 모든 트랜잭션을 직렬적으로 실행되는 것처럼 보이게 처리.
- 성능이 크게 저하되므로 데이터 무결성이 절대적으로 중요한 경우에만 사용.
예시
트랜잭션 T1이 salary > 5000 조건으로 데이터를 조회하는 동안, 다른 트랜잭션(T2)은 조건에 영향을 미치는 데이터를 추가, 수정, 삭제할 수 없다. T1이 실행을 마칠 때까지 T2는 해당 데이터에 대한 작업이 모두 대기 상태로 유지된다.
격리수준 비교
격리 수준 | Dirty Read | Non-Repeatable Read | Phantom Read | 특징 |
Read Uncommitted | O | O | O | 가장 느슨하고 성능 우수 |
Read Committed | X | O | O | 일반적으로 많이 사용 |
Repeatable Read | X | X | O (거의 발생 안 함) | MVCC 활용, 높은 데이터 정합성 |
Serializable | X | X | X | 가장 엄격, 성능 저하 |
참고문헌
트랜잭션 격리 레벨
트랜잭션 격리 레벨은 트랜잭션 내 명령문에 표시되는 데이터를 지정합니다. 이러한 레벨은 동일한 대상 데이터 소스에 대한 트랜잭션 간 발생할 수 있는 상호작용을 정의하여 동시액세스의 레
www.ibm.com
'DB' 카테고리의 다른 글
[DB] Normalization 정규화 이해하기 (1) | 2024.11.20 |
---|---|
관계형 데이터베이스와 비관계형 데이터베이스 (2) | 2024.11.19 |