공부

트랜잭션의 격리 수준 (Isolation level)

린구 2024. 11. 26. 16:01
반응형

격리 수준

- DB가 트랜잭션 간 동시 작업을 격리하는 수준 (level)

- 동시에 여러 트랜잭션이 동일 컬럼, 로우, 테이블에 읽고 쓴다면?

  • 예상하지 못한 데이터 이상 현상 발생 → 동시성 문제
  • 데이터 정합성/무결성이 위배됨
  • 따라서 DB는 4단계 트랜잭션 격리 수준 제공

 

Read Uncommitted

  • 가장 낮은 격리 수준
  • 트랜잭션이 커밋되지 않은 데이터를 다른 트랜잭션에서 읽을 수 있음
  • 장점 성능이 가장 좋음
  • 단점 데이터 일관성 보장 수준이 가장 낮음

 

Read Committed

  • 트랜잭션 커밋된 데이터읽을 수 있음
  • 다른 트랜잭션이 데이터를 수정하면 문제가 발생한다........
  • 장점 Dirty Read 방지
  • 단점 Non-Repeatable Read 가능 - 동일한 데이터를 읽어도 값이 달라짐

 

Repeatable Read

  • 한 트랜잭션이 읽는 데이터는 종료될 때까지 다른 트랜잭션에서 수정, 삭제 X
  • 새로운 행을 추가하거나 삽입은 가능 (새로운 데이터에 대해 방지하지 못함)
  • 장점 Non-Repeatable Read 방지
  • 단점 Phantom Read 가능

 

Serializable

  • 가장 높은 격리 수준
  • 트랜잭션이 순차적으로 실행
  • 읽기 작업조차 락을 사용해 동시성 제한
  • 장점 Phantom Read 방지, 완벽한 일관성
  • 단점 성능 저하 가능성

 

문제 유형

Dirty Read

  • 한 트랜잭션이 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 문제
  • DB와 다른 데이터를 읽는 문제!!!!!!!!!!!!!!!
  • 만약 다른 트랜잭션이 변경한 순간 데이터를 읽고 롤백하면 다른 데이터를 읽게 됨

 

Non-Repeatable Read

  • 한 트랜잭션이 읽고 있는 데이터를 다른 트랜잭션에서 수정하거나 삭제하는 문제
  • 읽고 있는데 수정함~~, 동일한 쿼리로 동일한 데이터를 조회했을 때 결과가 다름

 

Lost Update

  • 두 트랜잭션이 동일한 데이터를 읽고 수정한 후 저장할 때, 한 트랜잭션의 업데이트가 손실되는 문제
  • 낙관적 제어를 사용하는 경우 Repeatable Read에서도 발생할 수 있음

 

Phantom Read

  • 동일 조건의 쿼리에서, 다른 트랜잭션에 의해 추가, 삭제된 행으로 인해 결과가 달라지는 문제
  • Serializable 빼고 모두 발생할 수 있음

 


 

MySQL 기본 트랜잭션 격리 수준은 Read Committed

→ 따라서 별도 설정이 없는한 `Non-Repeatable Read`, `Lost Update`, `Phantom Read` 로 인한 동시성 문제가 발생할 수 있음

반응형