트랜잭션 격리수준

  • 여러 트랜잭션이 동시에 실행될 때 서로 간섭하지 않도록 하는 제어 수준
  • 격리 수준이 낮을수록 동시성이 높아지지만 데이터 일관성이 깨질 가능성이 있음
  • 격리 수준이 높을 수록 데이터 일관성이 보장되지만 성능이 저하될 수 있음
  • 데이터의 일관성과 무결성을 보장하면서 동시에 성능도 조절할 수 있는 기준

트랜잭션에서 발생할 수 있는 문제점

  • 격리 수준이 낮음 → 여러 트랜잭션이 동시에 수행될 때 데이터 정합성이 깨지는 문제 발생
  1. Dirty Read(더티 리드)
  • 다른 트랜잭션에서 아직 commit 되지 않은 데이터를 읽는 문제
  • 이후 롤백이 되면 잘못된 데이터를 읽게 됨
  1. Non-Repeatable Read(반복 읽기)
  • 같은 트랜잭션에서 동일한 데이터를 여러번 조회했을 때 값이 다르게 조회되는 문제
  • 다른 트랜잭션이 데이터를 수정 후 커밋하면 이전과 다른 데이터를 읽게 됨
  1. Phantom Read
  • 같은 트랜잭션에서 같은 조건으로 조회했는데 결과가 달라지는 문제
  • 다른 트랜잭션이 데이터를 INSERT / DELETE 한 경우 발생

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

  • 낮은 격리 수준일수록 성능은 좋지만 정합성이 낮아지고, 높은 격리 수준일수록 성능이 낮아지는 대신 정합성 보장
격리 수준Dirty ReadNon-Repeatable ReadPhantom Read성능
READ UNCOMMITTEDOOO🔥 매우 빠름
READ COMMITTEDXOO✅ 빠름
REPEATABLE READXXO⏳ 보통
SERIALIZABLEXXX🐌 느림
  • READ UNCOMMITED (읽기 미확정, 커밋되지 않은 데이터 읽기 허용)

    • 다른 트랜잭션에서 commit되지 않은 데이터도 읽을 수 있음 → Dirty Read 발생
    • 데이터 일관성 거의 없음, 가장 낮은 수준
    • 성능은 가장 좋음
    • 발생 가능 이상 현상 : Dirty Read
  • READ COMMITTED (커밋된 데이터만 허용)

    • 커밋된 데이터만 읽을 수 있음 더티 리드 방지
    • 같은 데이터를 두번 읽었을 때 값이 다를 수 있음
    • 대부분 DBMS 기본값
    • 발생 가능 이상 현상 : Non-repeatable Read
  • REPEATABLE READ (반복 가능한 읽기)

    • 같은 트랜잭션 내에서 같은 데이터를 읽으면 항상 동일한 결과
    • 읽은 데이터는 다른 트랜잭션이 수정할 수 없음 (읽은 데이터에 Shared Lock)
    • 발생 가능 이상 현상 : Phantom Read 트랜잭션 실행중 새로운 행이 생겨서 조회결과 바뀜
  • SERIALIZABLE(직렬화)

    • 트랜잭션들을 순차적으로 실행한 것처럼 완전한 고립 보장
    • 가장 엄격하고 안전하지만 성능 저하가 큼
    • 내부적으로 모든 읽기에 공유락을 걸고, 범위 조건 조회는 갭 락 등으로 제어
    • 이상 현상 모두 방지

Ref