카테고리 없음

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은 다음번에..