공부 이야기/데이터베이스
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 함으로써 시작과 종료의 일관성을 지킬 수 있음