본문 바로가기
ITPE/데이터베이스

[DB]Isolation Level 이란?

by 멍뭉카 2022. 8. 26.
반응형

Database의 isolation Level에 대해서 알아보겠습니다

 

여러 트랜잭션이 동시에 발생될 때 DB가 어떤 수준/방식으로 고립성(isolation)을 설정하고서 다중 트랜잭션을 처리하는지에 대한 부분이다 어떻게 다른 트랜잭션이 접근하지 못하도록 고립하는지에 대한 설정이 있어야 여러 트랜잭션이 동시에 수행될 때 어떻게 처리할 수 있는지를 알 수 있는 것이다.  이런 고립성에 대해서 알아보기 위해서는 먼저 고립성이 없다면 어떤 문제가 발생되느냐로 시작해 보면 이해하기 쉬운데요 그것이 바로 직렬성 위반입니다.

 

직렬성 위반 이란?

트랜잭션이 순차적으로 Serializable 하게 순서대로 수행된다면 값의 오류는 발생하지 않겠지만

동시에 여러 트랜잭션이 이루어진다면 동시에 두 사용자가 데이터를 수정 중이고, 데이터를 조회 중이라고 하면 같은 데이터를 서로 다르게 볼 수 있는 상황들이 생기게 될 수 있다

 

이 것이 직렬성 위반이라는 건데 직렬성 위반은 3가지로 분류한다

1) 부정판독(Dirty Read)

 - A가 특정 행을 수정

 - B가 해당 행을 조회

 - A가 특정 행 수정을 취소한다면 B는 틀린 값을 조회 한 결론이 되는데 이를 부정판독이라 한다

2) 비반복판독(Nonrepeatable Read)

 - A가 특정 행을 조회

 - B가 행을 수정

 - A가 다시 조회한다면  처음의 조회값은 확인할 수가 없다 이를 비반복 판독이라고 한다

3) 가상 판독(Phantom Read)

 - A가 어떤 조건을 조회

 - B가 추가 행을 Insert

 - A가 다시 조회 한다면 없었던 값이 보이게 되는데 이를 가상 판독이라 한다.

 

이러한 직렬성 위반의 유형들이 발생하지 않게 하기 위해서는 트랜잭션 발생 중에 데이터를 고립화하는 레벨이 필요합니다

 

Isolation Level 4가지

흔히 고립화 수준(Isolation Level)을 4가지로 분류하곤 합니다. 

1) Read Uncommitted

 - 이름 그대로,, Commit 되지 않는 데이터를 다른 트랜잭션이 조회(Read)하게 하는 수준입니다

 - 거의 제약이 없는 상태다 보니 Dirty Read, Nonrepeatable Read, Phantom Read가 모두 발생 가능합니다

(거의 자연인 상태?)

2) Read Committed

 - Commit 된 데이터만 읽는 것을 읽을 수 있도록 허용합니다

 - 하지만 그래도 행을 수정하는 Nonrepeatable Read, 행을 추가하는 Phantom Read는 발생할 수 있습니다

3) Repeatable Read

 - 데이터를 읽는 중이라면 다른 트랜잭션이 수정이나 삭제를 못하도록 하는 수준입니다

 - 그래도 새로운 값을 Insert 하는 Phantom Read는 발생할 수 있습니다

4) Serializable

 - 데이터를 읽는 중이라며 수정, 삭제, 삽입 모두 다 막는 수준입니다

 - 직렬성 위반을 모두 막을 수 있는 수준이라고 볼 수 있습니다

 

postgresql 사례

책에만 있는 내용으로 생각했는데,, 도커에 설치한 실제 postgresql에 아래처럼 파라미터 값을 조회해보니

isolation level이 설정된 걸 알 수 있다..(맙소사 진짜 있는 거였어)

 

고립수준-설정조회
출처 : 내PC, isolation leve 확인

 

고립수준-설정
출처 : 내PC, postgresql.conf 확인해봄

 

위 내용처럼  postgresql.conf에 isolation level의 설정값이 들어가 있네요 일반적으로는 read committed를 하지 않을까 싶어요 그 상위 고립화 수준은 매우 경직된 DB가 되지 않을까 싶습니다

 

 

반응형

댓글