트랜잭션의 Isolation이 제대로 유지되려면 복수의 트랜잭션을 동시에 실행할 경우, 이상 현상이 일어나지 않도록 한다.
이것을 보장하기 위한 중요한 속성이 Serializability와 Recoverable이다.
즉, 이 두 가지 속성이 보장될 수 있도록 해야 한다.
하지만 이때 동시에 처리할 수 있는 트랜잭션의 수가 줄어들어서 DBMS의 성능이 하락한다는 단점이 있다.
이를 해결하기 위해 DBMS의 concurrency control은 여러 종류의 Isolation level을 제공해서 개발자가 데이터 정합성과 성능 사이에서 어느 정도 트레이드 할 수 있도록 한다.
Serializabiliy
👉 여러 트랜잭션을 병렬로 동시에 처리하면서도 순차적으로 수행한 것과 같은 결과를 내는 것
Recoverable
👉 여러 트랜잭션 중 하나가 실패 시 회복이 가능한 것
값을 write하는 트랜잭션은 반드시 값을 read하는 트랜잭션보다 먼저 commit 되어야 함
1. 이상 현상
Isolation이 보장되지 않아 트랜잭션이
동시에 실행되면 발생하는 문제점은?
Dirty Write 더티 라이트
- 정의: 같은 데이터에 대해 동시에 두 개의 트랜잭션이 값을 바꾸고자 할 때 발생되는 현상
Dirty Read 더티 리드
- 정의: 아직 종료(commit)되지 않은 트랜잭션의 내용을 읽는 것. 비정상적 상태의 데이터를 읽게 되는 현상
- 어떠한 트랜잭션에서 처리한 작업이 완료되지 않았음에도 불구하고 다른 트랜잭션에서 볼 수 있게 되는 현상
Non-repeatable Read (반복 가능하지 않은 조회, Fuzzy Read)
- 정의: 어떤 트랜잭션에서 동일한 데이터 값을 매번 읽을 때마다 달라지는 현상
- 동일한 select 쿼리를 실행했을 때 항상 같은 결과를 보장해야 한다는 Repeatable Read 정합성에 어긋나는 현상
- 한 트랜잭션 내의 같은 행에 두 번 이상 조회가 발생했는데, 그 값이 다른 현상
Phantom Read 팬텀 리드
- 정의: 한 트랜잭션 내에서 동일한 쿼리를 두 번 보냈을 때, 첫 번째 쿼리에서 존재하지 않던 유령 레코드가 두 번째 쿼리에서 나타나는 현상 (없던 데이터가 생기는 현상)
❗ 이상 현상이 발생하면 안 되지만, 이런 이상 현상을 모두 발생하지 않게 한다면 제약사항이 많아져 동시 처리 가능한 트랜잭션 수가 줄어들게 된다.
👉 DB의 전체 처리량이 하락하게 됨
👉 일부 이상 현상은 허용하는 몇 가지 level을 만들어 개발자가 필요에 따라 적절하게 선택할 수 있도록 4단계로 그 수준을 분리함
2. 격리 수준Isolation level
- 정의: 동시에 여러 트랜잭션이 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것
- 위로 갈수록 동시성이 강해지지만 격리성은 약해지고, 아래로 갈수록 동시성은 약해지고 격리성이 강해짐
Read Uncommitted 커밋되지 않은 읽기
- 허용: 팬텀 리드, 반복 가능하지 않은 조회, 더티 리드
- 정의: 다른 트랜잭션에서 커밋되지 않은 내용도 조회할 수 있음
- 무결성을 위해 사용하지 않는 것이 좋음
Read Committed 커밋된 읽기
- 허용: 팬텀 리드, 반복 가능하지 않은 조회 허용
- 정의: 다른 트랜잭션에서 커밋된 데이터만 조회할 수 있음
- 하지만 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정 가능
- 가장 많이 사용되는 격리 수준, 많은 데이터베이스의 default 값
Repeatable Read 반복 가능한 읽기
- 허용: 팬텀 리드
- 정의: 트랜잭션에 진입하기 이전에 커밋된 내용만 조회할 수 있음
- 장점: 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아쥼
- 단점: 새로운 행을 추가하는 것은 막지 않음
- 특징: Undo 공간에 백업해두고 실제 레코드 값을 변경함
- 백업된 데이터는 불필요하다고 판단하는 시점에 주기적으로 삭제함
- Undo에 백업된 레코드가 많아지면 MySQL 서버의 처리 성능이 떨어질 수 있음
Serializable 직렬화 가능
- 정의: 트랜잭션을 순차적으로 진행. 매우 엄격함
- 특징: 트랜잭션에 진입하면 락을 걸어 다른 트랜잭션이 접근하지 못하게 한다.
- 단점: 교착 상태가 일어날 확률이 높고 성능이 매우 떨어짐 👉 거의 사용 X
- 동시성 가장 낮음, 격리성 가장 높음
| Isolation Level | Dirty Read | Non Repeatable Read | Phantom Read |
| Read Uncommitted | O | O | O |
| Read Committed | X | O | O |
| Repeatable Read | X | X | O |
| Serializable | X | X | X |

참고
https://github.com/devSquad-study/2023-CS-Study/blob/main/DB/db_transaction_isolation_level.md
https://nesoy.github.io/articles/2019-05/Database-Transaction-isolation
트랜잭션의 격리 수준(isolation Level)이란?
nesoy.github.io
https://mangkyu.tistory.com/299
[MySQL] 트랜잭션의 격리 수준(Isolation Level)에 대해 쉽고 완벽하게 이해하기
이번에는 트랜잭션 격리 수준(Isolation Level)에 대해 알아보도록 하겠습니다. 아래의 내용은 RealMySQL과 MySQL 공식 문서 등을 참고하여 작성하였으며, 모든 내용은 InnoDB를 기준으로 설명합니다. 해당
mangkyu.tistory.com
https://bubble-dev.tistory.com/entry/DB-Serializablilty
'Computer Science > DB' 카테고리의 다른 글
| [DB] 스키마 (1) | 2024.03.26 |
|---|---|
| [DB] RDBMS와 NoSQL (1) | 2024.03.18 |
| [DB] 트랜잭션(2) - 병행 수행과 병행 제어(Concurrency Control) (0) | 2024.03.14 |
| [DB] 트랜잭션(1) - 정의, ACID, 상태, 문법, 예외 (0) | 2024.03.13 |
| 스터디 1회차 예상 질문 (0) | 2024.03.11 |