ZeroBase/CS

트랜잭션 격리 수준과 발생 가능한 현상

Red_Horse 2025. 9. 30. 00:01

격리 수준에 따른 현상

 

팬텀 리드 (Phantom Read)

한 트랜잭션 내에서 동일한 쿼리를 2번 이상 보냈을 때 해당 조회 결과가 다른 현상

T1: SELECT * FROM products WHERE price < 10000;
    결과: 5개 행

T2: INSERT INTO products VALUES (6, 'Product F', 8000);  -- 새 행 추가
T2: COMMIT;

T1: SELECT * FROM products WHERE price < 10000;
    결과: 6개 행  ← 이전과 다른 결과 (팬텀 리드)
 
 

반복 가능하지 않은 조회 (Non-Repeatable Read)

한 트랜잭션 내의 같은 행에 두 번 이상 조회가 발생했는데, 그 값이 다른 것

T1: SELECT price FROM products WHERE id = 1;
    결과: 10000

T2: UPDATE products SET price = 15000 WHERE id = 1;
T2: COMMIT;

T1: SELECT price FROM products WHERE id = 1;
    결과: 15000  ← 같은 행인데 값이 다름 (Non-Repeatable Read)
 
 

더티 리드 (Dirty Read)

하나의 트랜잭션이 다른 트랜잭션의 아직 커밋되지 않은 데이터를 읽는 현상

T1: UPDATE accounts SET balance = 5000 WHERE id = 'A';
    (아직 커밋 안 함)

T2: SELECT balance FROM accounts WHERE id = 'A';
    결과: 5000  ← 커밋되지 않은 데이터 읽음 (Dirty Read)

T1: ROLLBACK;  -- T1이 롤백함

T2는 이미 5000이라고 읽었지만, 실제로는 원래 값으로 돌아감
 
 

트랜잭션 격리 수준

격리 수준은 낮을수록 성능이 좋지만 데이터 일관성 문제 발생 가능, 높을수록 데이터 일관성은 좋지만 동시성 성능 저하

 

1. SERIALIZABLE (직렬화 가능)

커밋이 완료된 데이터에 대해서만 조회할 수 있으며 트랜잭션을 순차적으로 진행시킵니다.

특징

  • 가장 높은 격리 수준
  • 여러 트랜잭션이 동시에 같은 행에 접근할 수 없음
  • 모든 읽기 현상 방지 (팬텀 리드, Non-Repeatable Read, Dirty Read 모두 방지)
  • 가장 느린 성능 (순차 실행)

발생 가능한 현상

  • ✅ 모든 현상 방지

2. REPEATABLE_READ (반복 가능한 읽기)

커밋 완료된 데이터에 대해서만 조회할 수 있으며 반복해서 행을 조회하더라도 똑같은 행을 보장하는 단계입니다.

특징

  • 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막음
  • 새로운 행을 추가하는 것은 막지 않음
  • 똑같은 범위 쿼리를 실행했을 때 이후에 추가된 행이 발견될 수도 있음
  • MySQL 8.0의 InnoDB 기본값

발생 가능한 현상

  • ❌ 팬텀 리드 발생 가능
  • ✅ Non-Repeatable Read 방지
  • ✅ Dirty Read 방지

3. READ_COMMITTED (커밋된 읽기)

커밋 완료된 데이터에 대해서만 조회할 수 있으며 커밋이 되지 않은 정보는 읽지 못합니다.

특징

  • 가장 많이 사용되는 격리 수준
  • PostgreSQL, Oracle 등의 기본값
  • 성능과 일관성의 적절한 균형

발생 가능한 현상

  • ❌ 팬텀 리드 발생 가능
  • ❌ Non-Repeatable Read 발생 가능
  • ✅ Dirty Read 방지

4. READ_UNCOMMITTED (커밋되지 않은 읽기)

가장 낮은 격리 수준이며 가장 빠릅니다. 다른 트랜잭션이 커밋하지 않은 정보를 읽을 수 있습니다.

특징

  • 최고 성능
  • 데이터 일관성 보장 없음
  • 실무에서 거의 사용하지 않음

발생 가능한 현상

  • ❌ 팬텀 리드 발생 가능
  • ❌ Non-Repeatable Read 발생 가능
  • ❌ Dirty Read 발생 가능

격리 수준별 현상 비교표

격리 수준 Dirty ReadNon-Repeatable ReadPhantom Read 성능 사용 빈도
READ_UNCOMMITTED ❌ 발생 ❌ 발생 ❌ 발생 ⚡⚡⚡⚡ 거의 없음
READ_COMMITTED ✅ 방지 ❌ 발생 ❌ 발생 ⚡⚡⚡ 매우 높음
REPEATABLE_READ ✅ 방지 ✅ 방지 ❌ 발생 ⚡⚡ 높음 (MySQL)
SERIALIZABLE ✅ 방지 ✅ 방지 ✅ 방지 낮음