이번에는 트랜잭션 격리수준을 간단하게 정리해보고자 한다.
1. 정의
동시에 여러 트랜잭션이 처리 될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할 지 여부를 결정하는 것을 말한다.
2. 단계
MySQL 기준으로 가장 높은 격리 수준 순서대로 보면 아래와 같다.
MySQL의 기본 격리 수준은 'Repeatable Read'이다.
- Serializable
- Repeatable Read
- Committed Read
- Uncommitted Read
※ 언두 영역
- UPDATE 문이나 DELETE 문으로 데이터 변경 시 이전 데이터를 보관 하는 영역
- 트랜잭션의 롤백 대비
- 트랜잭션의 격리 수준 유지하며 동시성 제공
2.1 Serializable
가장 고수준의 격리 수준이다.
여러 트랜잭션이 동일한 레코드에 접근을 할 수 없고 무조건 트랜잭션을 순차 진행 시키기 때문에 데이터 부정합은 발생하지 않으나 동시 처리가 불가능하여 속도를 보장 할 수 없다.
SELECT 작업에서도 대상 레코드에 Next Key Lock을 걸어버려서 다른 트랜잭션에서 절대 접근 할 수 없다.
정말 필요한 것이 아니라면 사용 하지 않는 것이 맞다.
2.2 Repeatable Read
커밋된 데이터만 읽을 수 있으며 자신 보다 낮은 트랜잭션 번호를 갖는 트랜잭션에서 커밋한 데이터만 읽을 수 있는 격리 수준이다.
변경 전/후의 데이터가 언두 영역에 모두 존재하기 때문에 데이터를 보장하는 것을 MVCC(Multi-Version Concurrency Control, 다중 버전 동시성 제어) 라고 한다.
이 MVCC로 인하여 한 트랜잭션 내에서는 동일한 결과를 보장하지만, 새로운 레코드가 추가되는 경우에 데이터 부정합이 발생 할 수도 있다.
새로운 레코드 추가 시 조회 결과가 달라 질 수 있기 때문에 다른 트랜잭션에서 수행한 작업에 의해 레코드가 보였다 안보였다 하는 현상인 Phantom Read(유령 읽기)가 발생 할 수 있다.
InnoDB 엔진인 MySQL에는 갭 락이 있어 유령 읽기가 발생하지 않는다.
2.3 Committed Read
커밋된 데이터만 조회 가능하다. MySQL을 제외하면 대부분 이를 기본 격리 수준으로 사용한다고 한다.
유령 읽기 및 Non-Repeatable Read(반복 읽기 불가능) 문제가 발생 할 수 있다.
다른 트랜잭션의 커밋 여부에 따라 조회 결과가 달라지기 때문에 발생하는 데이터 부정합 문제가 Non-Repeatable Read이다. 일반적인 경우에는 문제가 없을 수 있겠지만 돈과 관련된 부분이라면 고민을 해봐야한다.
하나의 트랜잭션에서 동일 데이터를 여러번 읽고 변경 하는데 정산과 관련된 부분이라면 문제가 반드시 발생 하기 때문에 격리 수준을 잘 파악하고 결과를 예측 할 수 있어야 한다.
2.4 Uncommitted Read
커밋되지 않은 데이터도 조회가 가능하다. 다른 트랜잭션의 작업이 커밋 or 롤백 되지 않아도 보이는 것이다.
따라서 정합성에 굉장히 부적합한 격리 수준이며 사용해서도 안될 것이다.
출처 및 참고
https://mangkyu.tistory.com/299
[MySQL] 트랜잭션의 격리 수준(Isolation Level)에 대해 쉽고 완벽하게 이해하기
이번에는 트랜잭션 격리 수준(Isolation Level)에 대해 알아보도록 하겠습니다. 아래의 내용은 RealMySQL과 MySQL 공식 문서 등을 참고하여 작성하였으며, 모든 내용은 InnoDB를 기준으로 설명합니다. 해
mangkyu.tistory.com
https://tlatmsrud.tistory.com/118
[DB] 트랜잭션 격리수준 (Isolation Level) 에 쉽게 이해하기
1. 개요 올해 6월부터 코로나 위기 단계가 하향 조정됨에 따라 7일 격리였던 격리 수준이 5일로 완화되었다. :) 어떤 단계에 따라 격리 수준 변경되고 있는데 우리가 사용하는 DB, 트랜잭션에도 격
tlatmsrud.tistory.com
'간단이론정리' 카테고리의 다른 글
[OOP] 객체 지향 4대 특징 및 객체 지향 5대 원칙(SOLID) (0) | 2024.06.20 |
---|---|
[OOP] 디자인 패턴(Design Pattern) 정리 (0) | 2024.06.20 |
[OS] 프로세스(Process)와 스레드(Thread) (0) | 2024.06.12 |
Filter, Interceptor 그리고 AOP (0) | 2024.06.12 |
HTTP Method 정리하기 (0) | 2024.05.25 |