MySQL 트랜잭션 격리 수준(ISOLATION LEVEL) 이해하기

트랜잭션은 데이터베이스의 신뢰성을 지키는 핵심 장치입니다. 하지만 격리 수준(Isolation Level)에 따라 데이터 일관성과 성능이 달라집니다. 

 

 

1) 트랜잭션 격리 수준이란?

트랜잭션 격리 수준은 여러 트랜잭션이 동시에 실행될 때, 서로의 데이터 읽기·쓰기 동작을 얼마나 차단할지를 정의합니다. 격리 수준이 높을수록 데이터 일관성은 강해지지만, 동시에 성능 저하 가능성이 있습니다.

 

 

2) MySQL의 4가지 격리 수준

  1. READ UNCOMMITTED아직 커밋되지 않은 데이터도 읽을 수 있는 가장 낮은 수준입니다. Dirty Read가 발생할 수 있어 일반적으로 사용하지 않습니다.
  2. READ COMMITTED다른 트랜잭션이 커밋한 데이터만 읽습니다. Dirty Read는 막지만, Non-Repeatable Read는 발생할 수 있습니다. Oracle의 기본 설정이며, MySQL에서는 명시적으로 설정해야 합니다.
  3. REPEATABLE READ (MySQL 기본값)트랜잭션 동안 같은 조건의 SELECT 결과가 항상 동일합니다. Phantom Read는 방지하지 못하지만, InnoDB에서는 갭 락(Gap Lock) 덕분에 대부분 방지됩니다.
  4. SERIALIZABLE가장 강력한 격리 수준으로 모든 SELECT에 공유 락을 걸어 직렬 실행처럼 동작합니다. 일관성은 최고지만 동시성이 크게 떨어집니다.

 

3) 주요 현상과 격리 수준 비교

현상 READ UNCOMMITTED READ COMMITTED REPEATABLE READ SERIALIZABLE
Dirty Read 발생 방지 방지 방지
Non-Repeatable Read 발생 발생 방지 방지
Phantom Read 발생 발생 발생(일반적) / InnoDB는 방지 방지

 

 

4) 격리 수준 설정 방법

-- 현재 세션 격리 수준 확인
SELECT @@transaction_isolation;

-- 세션 단위 변경
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

-- 전역 설정 변경
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;

Tip: 전역 설정 변경은 기존 연결에는 적용되지 않고, 새 연결부터 적용됩니다.

 

 

5) 어떤 수준을 선택해야 할까?

  • READ COMMITTED → 실시간 보고/조회가 많고 Dirty Read 방지가 필요한 경우
  • REPEATABLE READ → 대부분의 트랜잭션 처리, MySQL 기본값으로 안정적
  • SERIALIZABLE → 금융·회계 등 절대적인 데이터 일관성이 필요한 경우

 

 

MySQL의 트랜잭션 격리 수준은 데이터 정확성과 성능의 균형을 조절하는 중요한 도구입니다. 서비스 특성과 요구 사항에 맞춰 격리 수준을 선택하고, 성능 테스트를 병행하면 안정적인 시스템 운영이 가능합니다.