트랜잭션 격리 수준(Isolation Level)
트랜잭션 격리 수준(Isolation Level)은 하나의 트랜잭션이 다른 트랜잭션의 변경 사항을 볼 수 있는 정도를 정의하는 규칙입니다.
즉, 데이터의 일관성을 유지하면서 동시성을 관리하는 방법을 결정하는 중요한 요소입니다.
1. 트랜잭션에서 발생할 수 있는 동시성 문제
트랜잭션이 동시에 실행될 때, 아래와 같은 문제가 발생할 수 있습니다.
문제 유형설명
Dirty Read (더티 리드) | 다른 트랜잭션이 커밋하지 않은 데이터를 읽는 문제 |
Non-Repeatable Read (반복 불가능한 읽기) | 같은 데이터를 읽었을 때 값이 변경되는 문제 |
Phantom Read (팬텀 리드) | 같은 조건으로 조회했을 때 새로운 행이 추가되거나 삭제되는 문제 |
각 트랜잭션 격리 수준은 이러한 문제들을 방지하는 정도가 다릅니다.
2. 트랜잭션 격리 수준 및 특징
격리 수준 | Dirty Read | Non-Repeatable Read | Phantom Read | 성능 |
READ UNCOMMITTED | O (발생 가능) | O (발생 가능) | O (발생 가능) | 가장 빠름 |
READ COMMITTED | X (방지) | O (발생 가능) | O (발생 가능) | 중간 |
REPEATABLE READ | X (방지) | X (방지) | O (발생 가능) | 느림 |
SERIALIZABLE | X (방지) | X (방지) | X (방지) | 가장 느림 |
각 격리 수준을 자세히 설명하면 다음과 같습니다.
3. 트랜잭션 격리 수준 상세 설명
① READ UNCOMMITTED (읽기 미확정)
• 설명
• 트랜잭션이 커밋되지 않은 데이터(Dirty Data)를 읽을 수 있음.
• 즉, 다른 트랜잭션이 변경한 데이터를 커밋하기 전에 볼 수 있음.
• 가장 낮은 격리 수준으로, 동시성은 높지만 데이터 정합성이 보장되지 않음.
• 문제점
• Dirty Read(더티 리드) 발생 가능
• 예를 들어, A 트랜잭션이 데이터를 변경하고 B 트랜잭션이 이를 읽었지만, A 트랜잭션이 롤백하면 B 트랜잭션이 잘못된 데이터를 보게 됨.
• 예제
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
💡 사용 사례
• 데이터 정합성이 중요하지 않은 로그 기록 또는 통계 조회 시스템에서 사용 가능
• 하지만 대부분의 RDBMS는 기본적으로 이 수준을 허용하지 않음
② READ COMMITTED (읽기 확정)
• 설명
• 커밋된 데이터만 읽을 수 있음.
• 다른 트랜잭션이 커밋되지 않은 데이터를 변경하고 있어도 볼 수 없음.
• Dirty Read 문제는 해결되지만, Non-Repeatable Read 문제는 여전히 발생 가능.
• 문제점
• Non-Repeatable Read(반복 불가능한 읽기) 발생 가능
• 같은 데이터를 조회했을 때, 다른 트랜잭션이 값을 변경하고 커밋하면 결과가 달라질 수 있음.
• 예제
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
💡 사용 사례
• 대부분의 RDBMS에서 기본으로 설정되는 격리 수준 (예: Oracle, PostgreSQL)
• Dirty Read를 방지하면서 성능이 READ UNCOMMITTED보다 좋음
③ REPEATABLE READ (반복 가능한 읽기)
• 설명
• 트랜잭션이 시작된 이후 조회한 데이터가 변경되지 않도록 보장.
• 즉, 같은 데이터를 여러 번 조회해도 항상 동일한 값을 보장.
• Dirty Read와 Non-Repeatable Read 문제 해결, 하지만 Phantom Read 문제는 여전히 발생 가능.
• 문제점
• Phantom Read(팬텀 리드) 발생 가능
• 트랜잭션 중 다른 트랜잭션이 새로운 행을 삽입하면, 같은 조건으로 조회했을 때 데이터가 추가된 것처럼 보일 수 있음.
• 예제
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
💡 사용 사례
• 데이터 정합성이 중요한 경우(예: 은행 계좌 조회)
• MySQL의 기본 격리 수준
④ SERIALIZABLE (직렬화)
• 설명
• 가장 높은 격리 수준으로, 트랜잭션이 순차적으로 실행되도록 보장.
• 모든 트랜잭션을 직렬화하여 실행하는 효과.
• Dirty Read, Non-Repeatable Read, Phantom Read 모두 방지.
• 트랜잭션 간 충돌을 방지하지만, 성능 저하가 심함.
• 문제점
• 성능 저하가 가장 심각
• 동시성 처리가 어려워 대기 시간이 증가.
• 일반적으로 락을 사용하여 구현되므로, 많은 트랜잭션이 동시에 실행될 경우 Deadlock 위험 증가.
• 예제
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
💡 사용 사례
• 가장 높은 수준의 데이터 정합성이 필요한 경우 (예: 금융 거래, 회계 시스템)
• 하지만 성능이 크게 저하될 수 있어 최후의 수단으로 사용
4. 트랜잭션 격리 수준 선택 기준
상황추천 격리 수준
최대한 빠른 읽기 속도가 필요하고 데이터 정합성이 덜 중요한 경우 | READ UNCOMMITTED |
일반적인 웹 애플리케이션, Dirty Read 방지가 필요한 경우 | READ COMMITTED |
데이터 정합성이 중요하고 같은 데이터를 여러 번 읽을 경우 | REPEATABLE READ |
가장 높은 데이터 정합성이 필요하고, 동시성이 낮은 경우 | SERIALIZABLE |
5. MySQL vs PostgreSQL 기본 트랜잭션 격리 수준
DBMS기본 격리 수준
MySQL (InnoDB) | REPEATABLE READ |
PostgreSQL | READ COMMITTED |
Oracle | READ COMMITTED |
SQL Server | READ COMMITTED |
6. 정리
1. READ UNCOMMITTED: Dirty Read 허용 (정합성 낮음, 성능 좋음)
2. READ COMMITTED: Dirty Read 방지, Non-Repeatable Read 가능 (일반적인 웹 애플리케이션에 적합)
3. REPEATABLE READ: Dirty Read, Non-Repeatable Read 방지, Phantom Read 가능 (MySQL 기본값)
4. SERIALIZABLE: 모든 문제 방지, 가장 강력한 격리 수준 (성능 저하 큼)
💡 보통의 웹 애플리케이션에서는 READ COMMITTED 가 가장 적절하고,
💡 데이터 정합성이 중요한 경우 REPEATABLE READ 이상을 고려하는 것이 좋습니다.
'면접 준비 > DB' 카테고리의 다른 글
[DB] PhantomRead란? (0) | 2025.03.02 |
---|---|
[DB / JPA] 낙관적 락과 비관적 락 (0) | 2025.03.02 |
[CS 면접 질문 - DB] 파티셔닝 (0) | 2025.01.06 |
[CS 개념 정리 - DB] 정규화 (1) | 2025.01.06 |
[CS 개념 정리 - DB] 인덱스 (0) | 2025.01.06 |