[SQL] isolation level(격리수준)

DeMar_Beom·2023년 9월 22일
0

SQL

목록 보기
8/17

트랜잭션 격리수준

undo log와 트랜잭션 격리수준에 따른 동시성 제어에 대해서 알아보자

isolation level(격리수준)

  • 트랜잭션 격리수준(isolation level)이란 동시에 여러 트랜잭션이 처리될 때, 트랜잭션끼리 얼마나 고립되어 있는지를 나타내는 수준
  • 특정 트랜잭션이 다른 트랜잭션에 변경한 데이터를 볼 수 있도록 허용할지 말지를 결정하는 수준을 의미
    • 즉, 특정 트랜잭션에서 다른 트랜잭션 데이터를 볼 때 undo log를 읽을 지, Disk에 적힌 데이터를 읽을지 달라진다.
  • READ UNCOMMITTED
  • READ COMMITED
  • REPEATABLE READ
  • SERIALIZABLE
  • READ UNCOMMITTED에서 SERIALIZABLE로 갈수록 고립성이 높아지지만, 동시성이 저하됨
  • ORACLE = READ COMMITTED , mysql = REPEATABLE READ

트랜잭션 격리수준 관련 부정합 문제

트랜잭션 격리수준에 대해서 알아보기 전에 트랜잭션의 격리수준에 따른 부정합 문제를 먼저 확인이 필요합니다.

1. Dirty Read

  • Dirty Read는 다른 트랜잭션에 의해 수정되었지만 아직 commit되지 않은 데이터를 읽는 것을 의미

2. Non-Repeatable Read

  • Non-Repeatable Read는 한 트랜잭션 내에서 같은 Key를 가진 Row를 2번 읽었는데 그 사이에 값이 변경되거나 삭제되어 결과가 다르게 나타나는 현상

3. Phantom Read

  • Phantom Read는 한 트랜잭션 내에서 같은 쿼리를 두 번 실행했는데, 첫 번째 쿼리에서 없던 유령레코드가 2번째 쿼리에서 나타나는 현상

트랜잭션 격리수준

READ UNCOMMITTED

  • READ UNCOMMITTED는 각 트랜잭션에서의 변경 내용이 COMMIT, ROLLBACK여부에 상관없이 다른 트랜잭션에서 관여 가능
  • 정합성에 문제가 많아 사용하지 않는 것을 권함
  • Dirty Read, Non-Repeatable Read, Phantom Read 발생

READ COMMITTED

  • 트랜잭션에서 commit되어 확정된 데이터만 다른 트랜잭션이 읽도록 허용
  • 이 때, commit되지 않은 데이터에 대해서는 undo log에 있는 이전 데이터를 가져옴
  • Non-Repeatable Read, Phantom Read 발생
  • 트랜잭션-1이 Commit한 이후 아직 끝나지 않는 트랜잭션-2가 다시 테이블 값을 읽으면 값이 변경됨

Repeatable Read

  • 트랜잭션 내에서 삭제, 변경에 대해서 undo로그에 넣어두고 앞서 발생한 트랜잭션에 대해서는 실제 데이터가 아닌 Undo로그에 있는 백업데이터를 읽음
  • MySQL에서는 트랜잭션마다 트랜잭션 ID를 부여하여 트랜잭션 ID보다 작은 트랜재션 번호에서 변경한 것만 읽음
  • Phantom Read발생

Serialzable Read

  • 트랜잭션 내에서 쿼리를 두 번 이상 수행 시, 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 사라지지 않으며, 새로운 레코드가 나타나지 않음

참조

https://sabarada.tistory.com/117
https://nesoy.github.io/articles/2019-05/Database-Transaction-isolation

0개의 댓글