본문 바로가기
IT 지식

Isolation level

by ballena 2022. 3. 25.
  • 격리 수준(Isolation level)

DB에서 여러 Transaction이 동시에 실행될 때, 특정 트랜젝션이 다른 트랜젝션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것.

 

다른 트랜젝션 간 문제이므로 밑에서부터는 T1과 T2로 지칭

 

1. READ UNCOMMITTED(레벨 0)

T1에서의 변경 내용이 COMMIT이건 ROLLBACK이건 T2에서 값을 읽을 수 있다.

일관성(Consistency)/정합성에 문제가 생기기 쉬운 격리 수준이기에 사용하지 않는 것을 권장.

 

+ 트랜젝션 작업이 완료되지 않았는데 다른 트랜젝션에서 볼 수 있는 현상을 Dirty Read라고 한다.

 

 

2. READ COMMITTED(레벨 1)

관계형 데이터베이스에서 기본적으로 사용되고 있는 격리 수준. Dirty Read 현상은 발생하지 않는다.

실제 테이블 값을 가져오는 것이 아니라 Undo 영역에 백업된 레코드에서 값을 가져온다.

(T1이 업데이트라고 가정하면, 대충 실행 취소 - Undo - 를 가정하고 이전 값을 가져온다는 것)

 

여기서도 문제는 있다. T1이 진행 중이라도 T2는 Undo 영역에서 값을 가져오는데, T1이 Commit된 후에도 T2가 진행 중일 경우 트랜젝션 도중 같은 쿼리의 결과가 달라질 수 있다.

(하나의 트랜젝션 내에서 같은 SELECT 쿼리를 실행했을 경우, 항상 같은 결과를 가져와야 한다 = REPEATABLE READ)

 

 

3. REPEATABLE READ(레벨 2)

각 트랜젝션마다 ID를 부여한다. 트랜젝션은 자신의 ID보다 작은 ID를 가진 트랜젝션에서 변경한 데이터만 읽는다.

(MySQL의 경우다. Multi Version Concurrency Control이라고 한다.)

* T1(ID 12)과 T2(ID 10)이 있다고 가정하자. ID가 작은 것이 먼저 실행된 트랜젝션이다.

-> T2에서 Select가 발생한 후 T1에서 Update가 발생했다. 이후 T2에서 다시 Select가 발생한다면?

-> T1에서 Update 시 Undo 영역에 이전 값을 백업해놓는다.

-> T2가 다시 Select를 실행할 때, Update를 실행했던 T1의 ID가 T2보다 크므로 Update된 값을 읽지 않고 Undo 영역에 있는 값을 읽어온다. 이 값은 T2의 이전 Select 작업에서 읽었던 값과 동일할 것이다.

-> 데이터 일관성 확보 완료.

이전 데이터가 계속 Undo 영역에 있으면 DB 서버의 처리 성능이 떨어질 수 있으니 주기적으로 삭제한다.

 

* Phantom Read 문제 발생 : 다른 트랜젝션에서 수행한 변경 작업에 의해 레코드가 보였다 안보였다 하는 현상

T1이 수행 중일 때 T2가 새로운 레코드를 삽입할 경우 발생.

-> 방지하려면 쓰기 잠금 필요

 

 

4. SERIALIZABLE(레벨 3)

가장 단순하고 가장 강력한(= 엄격한) 격리 수준. Phantom Read가 발생하지 않는다.

반대급부로 동시 처리 성능이 가장 낮다. 그래서 DB에서 거의 사용되지 않는다고 한다.

 

 

 

출처 : 

https://nesoy.github.io/articles/2019-05/Database-Transaction-isolation

 

트랜잭션의 격리 수준(isolation Level)이란?

 

nesoy.github.io

'IT 지식' 카테고리의 다른 글

Kafka 입문 (1)  (0) 2022.09.01
TypeORM Migration  (0) 2022.04.25
대칭키/비대칭키 암호화 방식  (0) 2022.03.21
객체/파일/블록 스토리지  (0) 2022.03.15
Transit Gateway와 NACL  (0) 2022.02.24

댓글