프로그래밍/DB

Transaction Isolation Level (트랜잭션 격리 수준)

GONII 2025. 2. 26. 15:44

트랜잭션 격리 수준(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

 

반응형