트랜잭션의 격리성 수준

격리 수준Dirty ReadNon-Repeatable ReadPhantom Read
READ UNCOMMITTED발생발생발생
READ COMMITTED-발생발생
REPEATABLE READ--발생 (DB에 따라 다름)
SERIALIZABLE---

상세

  1. READ UNCOMMITTED (레벨 0)

가장 낮은 격리 수준으로, 커밋되지 않은 트랜잭션의 데이터 변경 내용을 다른 트랜잭션이 읽는 것을 허용한다.

  • 특징: 데이터 일관성을 거의 보장하지 않음.
  • 문제점: Dirty Read 발생. (트랜잭션 A가 수정 중인 데이터를 B가 읽었는데, A가 롤백할 경우 B는 무효한 데이터를 가진 꼴이 됨)
  1. READ COMMITTED (레벨 1)

가장 많이 사용되는 기본 격리 수준(Oracle, PostgreSQL 등)으로, 커밋 완료된 데이터만 조회할 수 있다.

  • 특징: Dirty Read 방지.
  • 문제점: Non-Repeatable Read 발생. (한 트랜잭션 내에서 같은 쿼리를 두 번 실행했을 때, 그 사이 다른 트랜잭션이 데이터를 수정/커밋하면 결과가 다르게 나타남)
  1. REPEATABLE READ (레벨 2)

한 트랜잭션 내에서 동일한 데이터를 반복해서 읽더라도 항상 동일한 결과를 보장한다. MySQL InnoDB의 기본 격리 수준이다.

  • 특징: 트랜잭션이 시작된 시점의 Snapshot을 이용해 조회하므로 데이터의 일관성 유지.
  • 문제점: Phantom Read 발생 가능. (다른 트랜잭션이 새로운 레코드를 삽입(Insert)할 경우, 이전에는 없던 레코드가 나타나는 현상)
  1. SERIALIZABLE (레벨 3)

가장 높은 격리 수준으로, 트랜잭션을 순차적으로 진행시킨다.

  • 특징: 모든 읽기 작업에도 공유 잠금(Shared Lock)을 걸어 동시성을 극도로 제한함.
  • 문제점: 성능 저하가 심해 실제 운영 환경에서는 거의 사용되지 않음.