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

데이터 정합성 보장을 위한 트랜잭션 이해하기 - 04. 트랜잭션 격리레벨

by 컴쏘 2023. 6. 7.

Isolation - 트랜잭션은 서로 간섭하지 않고 독립적으로 동작한다.

 

READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE READ 

위의 4가지는

  • Dirty Read
  • Non Repeatable Read
  • Phantom READ

이 3가지 중 몇가지를 방지하는가 혹은 허용하는가로 격리레벨이 결정된다.

 

Dirty Read

예제) 홍길동이 김국밥에게 900원을 송금하는 상황

트랜잭션 격리레벨은 여러 트랜잭션들이 존재할 때 서로 간섭하지 않는가이다.

트랜잭션 2개가 거의 비슷한 시간에 진입했다고 가정해보자.

첫번째 트랜잭션 : 900원을 출금시키기 위해 홍길동의 잔고(1000원)를 가져옴

그리고 곧바로 900원을 이체시키기 위해 김국밥 잔액에 900원을 넣어줌 (UPDATE)

트랜잭션이 실패 → 다시 김국밥 잔액이 500원이 된다. ⇒ 이렇게 되면 아무 문제가 없음

문제 발생

첫번째 트랜잭션이 실패하기 전에 두번째 트랜잭션이 김국밥의 잔고(1400원)를 읽어가는 경우

Dirty Read (커밋되지 않은 데이터를 읽음) 이다.

Non Repeatable Read

첫번째 트랜잭션 : 900원을 출금시키기 위해 홍길동의 잔고(1000원)를 읽음

두번째 트랜잭션에서 홍길동의 잔고를 1200원으로 업데이트함

만약 아직 커밋되지 않았으면, 첫번째 트랜잭션에서 다시 잔고를 읽더라도 1000원이다.

두번째 트랜잭션이 커밋을 함 → 첫번째 트랜잭션에서 다시 잔고를 읽으면 1200원이 됨

하나의 트랜잭션에서 같은 데이터를 3번을 읽었는데 다른 결과가 나옴

이런 현상을 **Non Repeatable Read(같은 데이터를 조회했는데 결과가 달라지는 것)**라고 한다.

Phantom Read

첫번째 트랜잭션에서는 1000원보다 많은 조건으로 조회를 한다.

→ 김국밥은 500원이고 홍길동은 1000원이기때문에 홍길동만 조회가 된다.

두번째 트랜잭션에서 김국밥의 잔고를 1200원으로 업데이트 한다. 그리고 커밋을 한다.

다시 첫번째 트랜잭션에서 같은 조건인 1000원보다 많은 조건으로 조회를 한다.

→ 홍길동, 김국밥 모두 1000원 이상이므로 둘 다 조회가 된다.

이런 현상을 Phantom Read(같은 조건으로 데이터를 읽었을 때 없던 데이터가 생기는 것) 라고 한다.

예시는 UPDATE로 인해 생겼지만, INSERT, DELETE 로도 일어날 수 있다.

트랜잭션 격리레벨

Dirty Read, Non Repeatable Read, Phantom Read 중 몇가지를 허용하느냐에 따라 격리레벨이 결정됨

  • Read Uncommitted
  • Read Committed
  • Repeatable Read : 커밋된 data를 보고 더해서 트랜잭션 id를 부여, 해당 트랜잭션보다 나중에 들어온 트랜잭션은 고려하지 않는다. → 항상 동일한 읽기를 보장
  • Serializable Read

아래로 갈수록 이상현상이 없지만, 동시 처리량이 낮음

주로 READ COMMITTED 혹은 REPEATABLE READ를 사용한다.

  • REPEATABLE READ는 겟락 같은 이슈가 있어서 데드락 이슈가 꽤 빈번하게 발생

2023 KAKAO Tech Campus_BackEnd 필수 과정
DB(MySQL) 강의 정리 내용입니다.