공부 이야기/데이터베이스

Isolation level이란?

mind: 2024. 2. 28. 19:32

트랜잭션이 시작하고 끝나는 시점 / Commit 여부 / 두 개의 변수인 경우

이 세 가지를 염두해놓고 생각해봐야 한다.


먼저 데이터 일관성이 깨지는 과정을 단계별로 알아보면 다음과 같다.

1) read uncommit

- commit 되지 않은 데이터를 읽기 때문에 동시에 두 개 이상의 트랜잭션에서 쓰기 연산 수행시 데이터 일관성이 깨질 수 있음


2) read commit

- commit 데이터를 읽고 쓰기 연산을 수행하기 때문에 데이터 일관성이 '어느 정도' 보장

- A 트랜잭션이 종료되기 전에

B 트랜잭션이 쓰기 연산을 하고 commit 까지 해버리면

A 트랜잭션이 종료될 때 시작시 조회했던 값이랑 불일치하는 경우가 발생하고 이를 non-repeatable read 라고 함.

반복 조회한 값이 서로 다르다는 뜻

3) repeatable read

- 위 단계와 마찬가지로 트랜잭션이 시작된 시점을 기준으로 latest commit 데이터를 읽지만

종료 시점의 데이터의 일관성을 지켜준다는 점에서 차이가 있음

- mysql innodb는 해당 단계가 기본 값인데 쓰기 연산 수행 시 undo 로그에 있는 값(=commit 되기 전의 값)을 조회 종료 시 반환해주기 때문에 시작과 종료의 일관성을 지킬 수 있음

- oracle에서는 select for update로 lock 제어를 해야 다른 트랜잭션을 block 함으로써 시작과 종료의 일관성을 지킬 수 있음