트랜잭션 격리 수준(isolation level)

minisoo·2023년 10월 29일
0

트랜잭션 격리 수준

동시에 여러 트랜잭션이 처리될 때, 특정 트랜잭션이 다른 트랜잭셕에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지 결정하는 것 (= 일관성 없는 데이터를 허용하도록 하는 수준)

필요성

트랜잭션의 ACID 특성을 보장하기 위함
Locking을 통해 해결할 수 있지만, 무조건 Locking으로 동시에 수행되는 수많은 트랜잭션을 순서대로 처리하게 되면 성능이 떨어지게 됨
반대로 느슨한 Locking은 데이터 무결성에 문제를 가져옴
효율적인 Locking의 사용을 위해 적절한 격리수준이 필요

종류

  1. Read Uncommitted (레벨 0)
    트랜잭션 처리중이거나, 아직 commit되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용함
    데이터베이스의 일관성을 유지하는 것이 불가능하기 때문에 Dirty Read가 발생함
  2. Read Committed (레벨 1)
    트랜잭션이 수행되는 동안 다른 트랜잭션이 접근할 수 없어 대기하게 됨
    한 트랜잭션의 변경내용이 commit되어야만 다른 트랜잭션에서 조회 가능
    대부분의 RDBMS에서 기본적으로 사용하는 격리수준
    Non-Repeatable Read가 발생할 수 있음
  3. Repeatable Read (레벨 2)
    트랜잭션이 시작되기 전 commit된 내용에 대해서만 조회 가능
    트랜잭션이 범위 내에서 조회한 데이터 내용이 항상 동일함을 보장함
    Phantom Read가 발생할 수 있음
    MySQL에서 기본으로 사용함
  4. Serializable (레벨 3)
    다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정 및 입력 불가능
    가장 단순하면서 엄격한 격리 수준이지만 처리성능이 가장 낮음

각 격리 레벨에 따라 발생하는 현상들

  • Dirty Read
    특정 트랜잭션에 의해 수정됐지만 아직 커밋되지 않은 데이터를 읽는 현상
  • Non-Repeatable Read
    한 트랜잭션 내에서 반복 읽기를 수행하면 다른 트랜잭션의 커밋 여부에 따라 조회 결과가 달라지는 현상
  • Phantom Read
    한 트랜잭션 내에서 같은 쿼리를 두번 수행 시, 첫번째 쿼리에는 없던 레코드가 두번째 쿼리에서 발생하는 현상

참고자료
트랜잭션 격리수준
Phantom Read
Non-Repeatable Read

profile
코딩하는 돌멩이 👻

0개의 댓글