[DB] 트랜잭션의 고립(격리) 수준(Isolation Level) | 고립 수준 예시

트랜잭션의 고립 수준(Isolation Level)이란?

트랜잭션의 고립 수준이란 트랜잭션들끼리 일관성 있는 데이터를 얼마나 허용할 것인지 정해놓은 수준이다.

즉, 트랜잭션 수행 중 다른 트랜잭션이 해당 데이터를 조회하는 것이 가능한 정도를 결정해 놓은 것이다.

고립 수준이 높을수록 일관성은 보장되지만 그만큼 동시성이 떨어져 성능이 하락한다.

 

트랜잭션에 대해 잘 모르겠다면 다음 게시물을 참고하자.

 

[DB] 트랜잭션(Transaction)이란? | ACID

트랜잭션(Transaction)이란? 트랜잭션은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 수행되어야할 일련의 연산들을 의미한다. 트랜잭션은

code-lab1.tistory.com

이상 현상의 종류

  1.  Dirty Read : 어떤 트랜잭션에서 아직 실행이 끝나지 않은 트랜잭션에 의한 변경사항을 보게 되는 경우
  2.  Non Repeatable Read : 어떤 트랜잭션이 같은 쿼리를 2번 실행하는데 그 사이에 다른 트랜잭션이 수정/삭제를 하여 같은 쿼리에 다른 값이 나오는 경우
  3.  Phantom Read : 어떤 트랜잭션이 같은 쿼리를 2번 실행하는데 그 사이에 없던 레코드가 추가되어 같은 쿼리에 다른 값이 나오는 경우

 

트랜잭션 고립 수준의 종류

READ uncommitted (LEVEL 0)

  • 각 트랜잭션에서의 변경 내용이 COMMIT이나 ROLLBACK여부에 상관없이 다른 트랜잭션에서 값을 읽을 수 있다.
  • 정합성에 문제가 많은 격리 수준이므로 사용하지 않는 것이 좋다.

READ UNCOMMITED
READ UNCOMMITED

READ uncommitted 상태에서는 위와 같이 COMMIT이 되지 않은 상태여도 UPDATE 된 값을 다른 트랜잭션에서 읽을 수 있다.

 

따라서 이때 Dirty Read, Non Repeatable Read, Phantom Read 문제가 모두 발생할 수 있다. 

 

READ committed (LEVEL 1)

  • 트랜잭션 수행이 완료되고 COMMIT 된 데이터만 다른 트랜잭션에서 READ 하도록 허용하는 수준이다.
  • 일반적으로 DBMS에서 기본으로 설정하는 레벨이다.

READ COMMITED
READ COMMITED

READ committed 상태에서는 위와 같이 COMMIT 되기 전에는 UNDO 영역에 백업된 레코드에서 값을 가져온다.

COMMIT이 끝난 후에 SELECT를 하면 바뀐 값을 가져오게 될 것이다.

 

READ committed 수준에서는 Dirty Read 문제는 발생하지 않는다. 하지만 아래와 같은 문제가 발생한다.

READ COMMITED PROBLEM
READ COMMITED의 문제점

트랜잭션 1이 COMMIT 하기 전에 트랜잭션 2의 SELECT 결과는 '제니'였다.

하지만 트랜잭션이 1이 COMMIT 하고 난 후의 SELECT 결과는 '태연'이었다.

따라서 Non Repeatable Read 문제가 발생한다. 

이외에도 Phantom Read 문제도 발생한다.

 

REPEATABLE READ (LEVEL 2)

  • 이론상 특정 트랜잭션에서 읽고 있는 데이터는 다른 트랜잭션에서 수정/삭제가 불가능하다.
  • 삽입(INSERT)은 가능하다.
  • 실제로 동작하는 방식은 자신의 트랜잭션 번호(ID) 보다 낮은 트랜잭션 번호에서 변경된(Commit 된) 것만 읽게 되고, 자신의 트랜잭션 번호보다 높은 트랜잭션에서 변경된 것은 UNDO 영역에 백업된 레코드를 읽게 된다.
  • UNDO 영역에 백업된 레코드가 많아지면 성능이 떨어질 수 있다.

REPEATABLE READ
REPEATABLE READ

REPEATABLE READ에서는 위와 같이 자신의 트랜잭션 번호(10) 보다 높은 트랜잭션 번호(12)에서 변경된 레코드는 UNDO 영역에 백업된 레코드를 읽게 된다. 

 

이와 같이 REPEATABLE READ에서는 Non Repeatable Read 문제가 발생하지 않는다. 하지만 아래와 같은 문제가 발생한다.

PHANTOM READ
PHANTOM READ

위와 같이 트랜잭션 2 내에서 SELECT COUNT(*)-전체 행의 개수를 구하는 쿼리-의 결과가 달라질 수 있다. 트랜잭션 1에서 INSERT 쿼리를 수행한 결과가 트랜잭션 2에게 보이기 때문이다. 따라서 PHANTOM READ 문제가 발생한다.

 

SERIALIZABLE (LEVEL 3)

  • 가장 단순하고 엄격한 격리 수준이다.
  • 모든 동작이 직렬화하게 작동한다. 
  • 특정 트랜잭션에서 읽고 있는 데이터는 다른 트랜잭션에서 수정/삭제/삽입이 불가능하다.
  • 동시성이 떨어져서 성능이 하락하여 잘 쓰이지 않는다.
  • Dirty Read, Non Repeatable Read, Phantom Read 문제가 발생하지 않는다.

반응형

댓글

Designed by JB FACTORY