isolation level 이란?
- 동시에 여러 트랜잭션이 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할 지 말지 결정하는 기준
- 격리 수준이 높아질수록 동시성도 떨어진다.
- 낮은 것부터 차례대로 Read Uncommitted, Read Committed, Repeatable Read, Serial Izable
동시에 처리되는 두 트랜잭션 A, B가 존재한다고 할 때,
1. Read Uncommitted (Dirty Read)
- 변경 내용이 commit/rollback 여부와 상관없이 A 또는 B에서 서로 보임
- 즉, A에서 처리한 상황이 완료되지 않아도 B에서 볼 수 있게 됨 => Dirty Read 발생
- 데이터 정합성에 문제가 많아 RDBMS 표준에서는 트랜잭션 격리 수준으로 인정하지 않음
- Dirty Read, Non-Repeatable Read, Phantom Read 발생
* Repeatable Read란 하나의 트랜잭션 내에서 동일 SELECT 쿼리를 실행하면 항상 같은 결과가 나와야 한다는 정합성을 뜻하는데,
즉 "Non-Repeatable Read"는 SELECT를 하고 또 SELECT를 하기 전에 데이터 변경이 있어 결과가 다르게 나오는 경우를 뜻함
* Phantom Read : SELECT ... FOR UPDATE 쿼리의 경우, 다른 트랜잭션에서 수행한 변경 작업에 의해 레코드가 보였다가 안보였다가 하는 경우를 뜻함.
2. Read Committed
- 데이터를 변경했더라도 A에서 commit된 데이터만 B에서 볼 수 있음
- commit이 안되어있다면 B는 Undo영역에 저장되어 있는 기존 값을 참고해서 보게 됨
- Oracle DBMS에서 기본으로 사용되고 있는 격리 수준(Shared Lock 사용)
- Non-Repeatable Read, Phantom Read 발생
3. Repeatable Read
- MySQL InnoDB에서 기본으로 사용되는 격리 수준(모든 데이터에 Shared Lock이 걸리므로 다른 사용자는 데이터 수정이 불가능함)
- InnoDB는 트랜잭션이 ROLLBACK될 가능성에 대비해서 변경 전 레코드를 Undo영역에 백업해두고 실제 레코드 값을 변경함. => MVCC
- MVCC를 위해 Undo 영역에 백업된 이전 데이터를 이용해서 동일 트랜잭션 내에서는 동일한 결과를 보여줄 수 있도록 보장 => Read Committed도 commit되기 전의 데이터를 보여줌
- Binary Log를 가진 MySQL 장비에서는 최소로 요구되는 격리 수준
- Non-Repeatable Read, Phantom Read 발생 X
Read Committed VS Repeatable Read
- Undo 영역에 백업된 레코드의 여러 버전 중 몇 번째 이전 버전까지 찾아 들어가는지의 차이!
(Undo에는 레코드 하나 당 한 슬롯만 들어가는 것이 아닌, 트랜잭션 버전별로 여러개가 들어갈 수 있음)
- Repeatable Read는 특정 트랜잭션 번호의 구간 내에서 백업된 데이터를 보여줌
- 트랜잭션을 종료하지 않으면 무한정으로 Undo영역이 커져 MySQL 성능이 떨어질 수 있음
하지만, 해당 문제를 일으키지 않으면 두 격리 수준의 성능 차이는 거의 없다.
각 레벨에서 어떤 과정을 통해서 어떤 문제점들을 방지할 수 있는지! 알아두자
'MySQL' 카테고리의 다른 글
[InnoDB] Redo Log와 checkpoint age (0) | 2021.02.22 |
---|---|
[InnoDB] In-memory buffer의 종류 (0) | 2021.02.19 |
05. InnoDB 트랜잭션 처리 및 로그(Undo/Redo) 관리 (0) | 2020.06.23 |
04. MySQL에서의 잠금 - (2) MyISAM과 MEMORY 스토리지 엔진 (0) | 2020.06.15 |
04. MySQL에서의 잠금 - (1) MySQL 엔진 (0) | 2020.06.15 |