-
Database 격리 수준에 관하여카테고리 없음 2023. 7. 31. 01:40
데이터베이스를 학습하면서 다양한 격리수준과 관련하여 발표하는 시간이 있었는데 자료를 만들지 못해 이번을 기회로 작성하고자 한다.
Read uncommited
- 데이터 베이스에서 트랜잭션이 적용되지 않은 단계?라고 할수 있지 않을까?
- 다른 트랜잭션의 commit되지 않은 데이터를 읽을 수 있다(dirty read)는 문제가 존재한다.
간단한 예시를 살펴보자
일단 User A가 point를 2회 연속으로 발급받는 transaction 을 생각해보자.
- 일간 출석체크와 주간 출석체크가 동시에 완료되면 이런경우가 생기겠지?
만약 격리수준이 Read Uncommited 라면 다른 트랜잭션의 데이터를 읽을수 있기에 아래와 같은 상황에서 문제가 생길 수 있다.
이럼 어떤문제가 생기는지 Error를 가정해보자
홀리몰리...
어떻게 해결하지?
Read commited
- 다른 데이터베이스 트랜잭션의 데이터를 읽을 수 없는 격리수준
어떻게 해결되었을까?
"잔액이 부족합니다." 덕분에 다른 트랜잭션도 롤백이 되는걸 볼 수 있다
완벽한 방법일까?
요런 상황을 가정해보자.
- 계좌 2개를 조회하면서 중간에 송금을 진행하는 경우
송금하기전에 데이터를 읽었는데 돈이 없어지는 사태가 발생한다.
물론 다시 읽으면 문제가 없겠지만 이런 한번의 경우로 일관성이 깨진다.어떻게 해결할 수 있을까?
스냅숏을 이용해 해당 문제를 해결해 보자
Repeatable Read
- tx번호를 매기고 해당 자신의 tx에서 값을 가져오도록 스냅숏을 관리한다.
오호.. 이제는 Tx1에서 데이터를 읽을 것이니 일관성을 지킬 수 있었다.
이제 완벽할까?
Serializable은 다음번에..