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) 강의 정리 내용입니다.
'CS > 데이터베이스' 카테고리의 다른 글
동시성 제어하기 - 02. 쓰기락과 읽기락 - 이론 (0) | 2023.06.07 |
---|---|
동시성 제어하기 - 01. 멀티 스레드 환경에 대한 이해 (0) | 2023.06.07 |
데이터 정합성 보장을 위한 트랜잭션 이해하기 - 02. 트랜잭션 A, C, I, D (0) | 2023.06.07 |
데이터 정합성 보장을 위한 트랜잭션 이해하기 - 01. 트랜잭션이 없는 세상은 (0) | 2023.06.06 |
타임라인 최적화 - 06. 타임라인에서 배우는 트레이드 오프 (0) | 2023.06.06 |