본문 바로가기
프로그래밍/데이터베이스

트랜잭션 격리 수준(Transaction Isolation Level)에 대해서

by bantomak 2023. 5. 10.

 


트랜잭션(Transaction)

트랜잭션이란 여러 개의 작업을 하나로 묶은 작업의 단위(Unit Of Work)를 말한다.

  • 특정 작업으로 시작해서 묶여 있는 모든 작업들을 다 완료되어야 성공으로 처리한다.
  • 트랜잭션에 속해있는 여러 작업 중에서 하나 라도 실패하면 이 트랜잭션에 속한 모든 작업을 실패한 것으로 처리한다.
  • 포함된 작업이 하나라도 실패하면 트랜잭션도 실패한다. 모든 작업이 성공하면 트랜잭션도 성공한다.
  • 트랜잭션은 성공 또는 실패의 결과만을 갖는다.

데이터베이스 트랜잭션은 ACID라는 특성을 갖는다.

 

acid

A.C.I.D

ACID는 트랜잭션을 정의하는 4가지 주요 속성인 원자성, 일관성, 격리성 및 내구성을 말한다.

 

원자성(Atomicity)

트랜잭션의 각 문(데이터 읽기, 쓰기, 업데이트 또는 삭제)은 단일 단위로 처리된다. 전제 문이 실행되거나 아무것도 실행되지 않는다. 이 속성은 스트리밍 데이터 원본이 스트리밍 중간에 실패하는 경우와 같이 데이터 손실 및 손상이 발생하지 않도록 한다.

 

일관성(Consistency)

트랜잭션이 미리 정의되고 예측 가능한 방식으로만 테이블을 변경하도록 한다. 트랜잭션 일관성은 데이터의 손상이나 오류로 인해 테이블 무결성에 의도하지 않은 결과가 발생하지 않도록 한다.

 

격리성(Isolation)

여러 사용자가 동일한 테이블에 한 번에 읽고 쓰는 경우 트랜잭션을 격리하면 동시 트랜잭션이 서로 간섭하거나 영향을 주지 않는다. 각 요청은 실제로 동시에 발생하더라도 하나씩 발생하는 것처럼 처리된다.

 

지속성(Durability)

시스템 오류가 발생한 경우에도 성공적으로 실행된 트랜잭션에 의해 수행된 데이터 변경 사항이 저장되도록 한다.

 

 

격리 수준(Isolation Level)

SQL Standard에서 정의한 Isolation Level은 다음과 같습니다.

 

  • READ UNCOMMITTED(레벨 0)
  • READ COMMITTED(레벨 1)
  • REPEATBLE READ(레벨 2)
  • SERIALIZABLE(레벨 3)

READ UNCOMMITTED

SELECT 쿼리 실행 시에 다른 트랜잭션에서 COMMIT 되지 않은 데이터를 읽어올 수 있다.

COMMIT 되지 않은 데이터를 읽는 현상을 Dirty Read라고 한다.

INSERT만 진행되고 ROLLBACK 될 수도 있는, 즉 한 번도 COMMIT 되지 않은 데이터를 읽을 수 있어 주의가 필요하다.

 

READ COMMITTED

Read Committed에서는 COMMIT이 완료된 데이터만 SELECT시에 보이는 수준을 보장하는 Level이며 대부분의 DBMS에서 Read Committed를 기본으로 설정한다.

 

Read Committed에서는 Read Uncommitted에서 발생하는 Dirty Read가 발생하지 않도록 보장해 준다.

 

Read Committed의 문제는 하나의 트랜잭션 안에서 SELECT를 수행할 때마다 데이터가 동일하다는 보장을 해주지 않는다. 그 이유는 트랜젝션에서 해당 데이터가 COMMIT 된 경우에만 반환해 주는 게 Read Committed의 특징이기 때문이다.

위와 같은 이유로 Read Committed를 Non-repeatable Read라고도 부른다.

 

REPEATABLE READ

Read Committed와는 다르게 Repeatable Read는 한 트랜잭션 안에서 반복해서 SELECT를 수행하더라도 읽어 들이는 값이 변화하지 않음을 보장한다.

 

Repeatable Read 트랜잭션은 처음으로 SELECT를 수행한 시간을 기록한 뒤 그 이후에는 모든 SELECT마다 해당 시점을 기준으로 Consistent Read를 수행한다. 그러므로 트랜잭션 도중 다른 트랜잭션이 COMMIT 하더라도 새롭게 추가 혹은 변경된 데이터는 보이지 않게 된다.

 

그 이유는 첫 SELECT시에 생성된 SNAPSHOT을 읽기 때문이다.

 

SERIALIZABLE

Serializable은 모든 작업을 하나의 트랜젝션에서 처리하는 것과 같은 가장 높은 고립 수준을 제공한다.

다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정 및 입력 불가능

 

Read Committed, Repeatable Read 두 개의 공통적인 이슈인 Phantom Read가 Serializable에서는 발생하지 않는다.

 

Isolation Level Dirty Read Non-Repeatable Read Phantom Read
Read Uncommitted O O O
Read Committed - O O
Repeatable Read - - O
Serializable - - -

 

낮은 단계 Isolation Level을 활용할 때 발생하는 현상들

Dirty Read

  • 트랜잭션에서 아직 실행이 완료되지 않은 다른 트랜잭션에 의한 변경사항을 보게 되는 경우
  • 커밋되지 않은 수정 중인 데이터를 다른 트랜잭션에서 읽을 수 있도록 허용하기 때문에 발생하는 현상

Non-Repeatable Read

  • 한 트랜잭션에서 같은 쿼리를 두 번 수행할 때 그 사이에 다른 트랜잭션 값을 수정 또는 삭제하면서 두 쿼리의 결과가 상이하게 나타나는 일관성이 깨진 현상
  • 한 트랜잭션에서 똑같은 SELECT를 수행했을 때 항상 같은 결과를 반환해야 한다는 Repeatable Read 정합성이 어긋남

Phantom Read

  • 한 트랜잭션 안에서 레코드를 두 번 이상 읽었을 때, 첫 번째 쿼리에서 없던 레코드가 두 번째 쿼리에서 나타나는 현상
  • 트랜잭션 도중 새로운 레코드 삽입을 허용하기 때문에 발생한다.

 

Reference

 

Transaction Isolation Level 정리

Isolation을 알기전에 먼저 트랜잭션이 중요시 여기는 ACID라는 것을 먼저 알아야 합니다.Atomicity, Consistency, Isolation, Durability의 앞글자를 따서 ACID라고 불리웁니다.하나의 트랜잭션이 작업이 그중에

velog.io

 

[DB] 트랜잭션 격리 수준(Transaction Isolation Level)

개념 트랜잭션 격리수준(isolation level)이란 동시에 여러 트랜잭션이 처리될 때, 트랜잭션끼리 얼마나 서로 고립되어 있는지를 나타내는 것이다. 즉, 특정 트랜잭션이 다른 트랜잭션에 변경한 데

dar0m.tistory.com

댓글