본문 바로가기
DevOps/DB

[DB] 트랜잭션 격리수준(isolation level)이란?

by 뽀뽀이v 2023. 5. 7.

트랜잭션의 격리 수준

동시에 여러 트랜잭션이 처리될 때, 특정 트랜잭션이 다른 트랜잭션에 영향을 미치도록 허용 여부를 결정하는 것이다.

 

트랜잭션 격리 수준의 필요성

트랜잭션이 다른 트랜잭션이 관여하지 못하도록 Locking이라는 개념이 등장하게 된다.

높은 수준의 Locking으로 수많은 트랜잭션들을 순서대로 처리할 시에 DB 성능은 떨어지게 된다.

반대로 성능을 위해 Locking의 수준을 낮춘다면 DB의 값을 보장하지 못한다. 

그렇기 때문에 최대한 효율적인 Locking 방법을 선택해야 한다.

 

트랜잭션 격리 수준의 종류

READ UNCOMMITED (Level 0)

  • COMMIT 되지 않은 상태의 UPDATE 된 값을 다른 트랜잭션에서 읽을 수 있다. 커밋이 되지 않고 만약 롤백이 된다면 UPDATE 된 값을 읽은 트랜잭션은 비일관된 상태에 놓이게 된다. (※ Dirty Read라고 한다.)
  • 정합성에 문제가 많은 격리 수준으로 사용하지 않는 것을 권장한다.

 

READ UNCOMMITTED

READ COMMITED (Level 1)

  • 가장 많이 사용되고 있는 격리 수준이다. Dirty Read와 같은 현상은 발생하지 않는다.
  • Undo 영역의 백업된 값을 조회한다.
  • 하나의 트랜잭션에서 똑같은 SELECT 쿼리를 실행하였을 때, 그 사이 다른 트랜잭션이 값을 수정 또는 삭제하다면 결과에 정합성이 보장되지 않는다. (※ Non-Repeatable Read라고 한다.)

 

READ COMMITTED

REPEATABLE READ (Level 2)

  • 트랜잭션마다 트랜잭션 ID를 부여하여 해당 ID 보다 작은 트랜잭션 번호에서 변경한 것만 읽게 한다.
  • Undo 공간에 백업해두고 실제 값을 변경한다. Undo 공간의 백업 데이터는 불필요 시점에 주기적으로 삭제한다.
  • Undo에 백업된 레코드가 많아지면, 서버의 처리 성능이 떨어질 수 있다.
  • 이러한 방식을 Multi Version Concurrency Control(다중 버전 동시성 제어)라고 부르며, 이를 채택하는 DBMS가 많아지고 있다.

SERIALIZABLE (Level 3)

  • 가장 엄격한 격리 수준이지만, 성능 측면에서는 가장 낮다.
  • PHANTOM READ가 발생하지 않는다. DB에서 거의 사용되지 않는다. (※ PHANTOM READ란? 한 트랜잭션에서 같은 쿼리를 두 번 수행할 때, 첫 번째 쿼리에서 없던 값이 두 번째 쿼리에서 나타는 현상이다.)
레벨 Dirty Read Non_repeatable Read Phantom Read
Read Uncommitted 가능 가능 가능
Read Commited 불가능 가능 가능
Repeatable Read 불가능 불가능 가능
Serializable Read 불가능 불가능 불가능

 

RDB(MySQL, Oracle) 기본 Isolation Level

  • ORACLE : READ COMMITTED, SERIALIZABLE 지원
  • MySQL : REPEATABLE READ

댓글