트랜잭션 격리 수준(Isolation Level)은 동시에 여러 트랜잭션이 실행될 때, 서로에게 미치는 영향을 얼마나 허용할지 결정하는 설정입니다.
격리 수준이 높을수록 데이터 일관성(Consistency)은 좋아지지만, 성능 오버헤드가 증가할 수 있습니다.
1. 트랜잭션 격리 수준과 발생할 수 있는 문제
트랜잭션을 동시에 실행할 때 발생할 수 있는 대표적인 문제는 다음과 같습니다.
문제 | 설명 |
Dirty Read (더티 리드) | 다른 트랜잭션이 커밋하지 않은 데이터를 읽는 문제 |
Non-Repeatable Read (반복 불가능한 읽기) | 같은 데이터를 여러 번 조회할 때, 중간에 다른 트랜잭션이 변경하여 값이 달라지는 문제 |
Phantom Read (팬텀 리드) | 같은 조건으로 여러 번 조회할 때, 중간에 다른 트랜잭션이 데이터를 추가/삭제하여 결과가 달라지는 문제 |
2. Isolation Level 종류
SQL 표준에서는 4가지 격리 수준을 정의하고 있으며, 낮은 수준일수록 동시성이 증가하고, 높은 수준일수록 데이터 일관성이 보장됩니다.
격리수준 | Dirty Read | Non-Repeatable Read | Phantom Read |
READ UNCOMMITTED | 발생 가능 | 발생 가능 | 발생 가능 |
READ COMMITTED (기본값 - Oracle, MSSQL) | 방지 | 발생 가능 | 발생 가능 |
REPEATABLE READ (기본값 - MySQL InnoDB) | 방지 | 방지 | 발생 가능 |
SERIALIZABLE | 방지 | 방지 | 방지 |
3. 각 격리 수준 상세 설명
① READ UNCOMMITTED (읽기 미확정)
- 트랜잭션이 커밋되지 않은 데이터도 읽을 수 있음.
- Dirty Read, Non-Repeatable Read, Phantom Read가 모두 발생 가능.
- 가장 낮은 격리 수준으로 동시성은 높지만 데이터 정합성이 낮음.
📌 사용 예시:
- 로그 저장, 임시 데이터 저장 등 데이터 정합성이 중요하지 않은 경우.
② READ COMMITTED (읽기 확정)
- 트랜잭션이 커밋된 데이터만 읽을 수 있음.
- Dirty Read는 방지되지만, Non-Repeatable Read와 Phantom Read는 발생 가능.
- 대부분의 DBMS(Oracle, MS SQL)의 기본 격리 수준.
📌 사용 예시:
- 대부분의 일반적인 애플리케이션에서 사용.
③ REPEATABLE READ (반복 가능 읽기)
- 같은 트랜잭션 내에서는 항상 동일한 값을 읽음 (Non-Repeatable Read 방지).
- 하지만 새로운 데이터가 추가되거나 삭제되는 Phantom Read는 발생 가능.
- MySQL InnoDB의 기본 격리 수준.
📌 사용 예시:
- 은행 계좌 잔액 조회, 송금 처리 등 일관성이 중요한 경우.
④ SERIALIZABLE (직렬화)
- 가장 강력한 격리 수준으로, 모든 트랜잭션을 순차적으로 실행하는 것과 동일한 효과.
- Dirty Read, Non-Repeatable Read, Phantom Read 모두 방지.
- 하지만 트랜잭션 충돌이 많아 성능이 저하될 수 있음.
📌 사용 예시:
- 회계 시스템, 금융 거래 등 데이터 정합성이 절대적으로 중요한 경우.
4. 트랜잭션 격리 수준 설정 (예제 코드)
MySQL에서 격리 수준을 설정하는 방법입니다.
현재 격리 수준 확인
SELECT @@transaction_isolation;
격리 수준 설정
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 현재 세션에서만 적용
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ; -- 전체 데이터베이스에 적용
5. 정리 및 선택 기준
✔ 어떤 격리 수준을 선택해야 할까?
- 최대한 낮은 격리 수준을 사용하고, 필요하면 높이는 방식이 일반적.
- 성능이 중요하면 READ COMMITTED 사용.
- 데이터 정합성이 더 중요하면 REPEATABLE READ 또는 SERIALIZABLE 사용.
🔹 일반적인 애플리케이션 → READ COMMITTED (Dirty Read 방지, 기본값)
🔹 금융/은행 등 정합성이 중요한 경우 → REPEATABLE READ or SERIALIZABLE
✅ 정리하면, 트랜잭션 격리 수준은 동시성과 데이터 정합성 사이의 균형을 맞추는 설정
✅ 가능한 낮은 수준을 기본으로 사용하고, 필요에 따라 상위 수준을 적용하는 것이 일반적
참고
https://jettstream.tistory.com/83
트랜잭션 격리 수준(Transaction Isolation Level)에 대해서
트랜잭션(Transaction) 트랜잭션이란 여러 개의 작업을 하나로 묶은 작업의 단위(Unit Of Work)를 말한다. 특정 작업으로 시작해서 묶여 있는 모든 작업들을 다 완료되어야 성공으로 처리한다. 트랜잭
jettstream.tistory.com
반응형