Transaction(트랜잭션) 격리수준
트랜잭션 격리수준을 계속 보면서 외웠는데, 이름의 의미와 각 격리단계를 보완하기위한 전략을 이해하는 방법으로 다시 격리수준을 학습해보았다.
이번에 조금 더 깊게 공부하면서, 왜 MySQL 혼자 Repeatable Read 의 격리단계를 기본 단계로 갖는지 알 수 있었다. (Next Key Lock덕분)
그리고 오라클이 고가용성에 좋다고 알고있는데, 이것이 지원하지 않는 격리 수준과 관계가 있는걸까? 하는 의문이 들었다. 물론, 아직 의문을 해결하지는 못했다.
트랜잭션
하나의 기능을 수행하기 위한 SQL 연산들의 집합을 의미
트랜잭션의 성질
- Atomicity(원자성)
트랜잭션은 모든 연산이 완전히 성공적으로 수행되어야 한다. 그렇지 않다면 아예 수행되지 않아야 한다. All or Nothing - Consistency(일관성)
트랜잭션 이전과 이후 데이터의 상태가 모두 일관적이어야 한다. - Isolation(격리성)
서로 다른 트랜잭션은 서로 영향을 받지 않고, 독립적으로 수행되어야 한다. - Durability(지속성)
커밋된 트랜잭션은 영구적으로 DB에 반영되어야 한다. 롤백이 가능해야 한다는 뜻
격리수준이란?
서로 다른 트랜잭션이 어느 정도 서로 영향을 주는지 정도를 나타내는 것
격리단계 (낮은 수준부터)
Uncommitted Read | Committed Read | Repeatable Read | Serializable | |
현상 | Dirty Read | Non repeatable Read | Phantom Read | |
특징 | 가장 낮은 수준 | Redo, Undo 영역 | MVCC, Exclusive Lock, Next Key Lock | Shared, Exclusive, Next Key Lock |
RDBMS | 오라클 지원 X | MySQL제외 기본 격리수준 | MySQL 격리수준, 오라클 지원 X |
Uncommitted Read
커밋되지 않은 값 읽기
- 가장 낮은 격리 수준
- 오라클은 지원하지 않음
- 부정확한 값을 읽을 수 있는 Dirty Read 현상 발생
- 먼저 값을 바꾼 트랜잭션이 롤백한 경우
Committed Read
커밋된 값을 읽기
- MySQL을 제외한 대부분의 RDMS의 격리수준 기본값
- 커밋된 값을 읽기에 Dirty Read는 발생하지 않음
- Redo(커밋 Info), Undo(변경된 레코드의 변경 전 Info) 영역 활용
- 변경된 사항이 있으면, 변경 전 값과 PK를 Undo에 저장함
- Undo Log Buffer를 이용하여 메모리에 저장함
- Redo(커밋 Info), Undo(변경된 레코드의 변경 전 Info) 영역 활용
- 다른 트랜잭션의 영향을 여전히 받기 때문에, 다른 트랜잭션의 커밋 전후로 값이 달라 Non Repeatable Read 현상 발생
Repeatable Read
반복가능하게 읽기
- 반복해서 읽어도, 값이 달라지지 않는다는 의미
- MVCC: 동일한 레코드에 대해서 스냅샷을 찍어, 여러 버전으로 관리하여 데이터 읽을 때 계속 동일한 값을 보장할 수 있음
- Exclusive Lock: 쓰기, 업데이트 시에 다른 트랜잭션이 어떠한 작업도 하지 못하도록 LOCK을 거는 것
- MySQL의 기본 격리 수준
- 쓰기에 대해서만 락을 거는 것이기 때문에, Insert에 대해서는 막지 못함
- 다른 트랜잭션에 의해 새로운 레코드가 생긴 것처럼 보이는 Phantom Read
- MySQL에서는 레코드 범위에도 Lock을 거는 Next key lock 기법을 통해 이러한 현상을 발생시키지 않음
Serializable
순차적
- Shared Lock, Exclusive Lock, Next Key Lock 기법 이용
- 모든 트랜잭션이 순차적으로 실행되도록 하여, 정확성을 완벽하게 보장함
'CS > 데이터베이스' 카테고리의 다른 글
[DB] 다대다(M:N)를 일대다(1:N), 다대일(M:1)로 만들어주는 이유는 뭘까? (9) | 2024.07.23 |
---|