트랜잭션의 격리 수준(Isolation Level)이란 여러 트랜잭션이 동시에 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 말지를 결정하는 것이다.
격리 수준 종류
1.READ UNCOMMITTED
2. READ COMMITTED
3. REPEATABLE READ
4. SERIALIZABLE
각 트랜잭션의 격리 수준에 따라 세가지 부정합이 생길 수 있다.
-
- DIRTY READ
커밋되지 않은 데이터를 데이터를 다른 트랜잭션에서 읽는 상황
- DIRTY READ
-
- NON-REPEATABLE READ
한 트랜잭션에서 같은 쿼리를 두 번 수행할 때 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제함으로써 두 쿼리의 결과가 다르게 나타나는 현상
- NON-REPEATABLE READ
-
- PHANTOM READ
한 트랜잭션 안에서 일정 범위의 레코드를 두 번 이상 읽었을 때, 첫번째 쿼리에서 없던 레코드가 두번째 쿼리에서 나타나는 현상. 이는 트랜잭션 도중 새로운 레코드가 삽입되는 것을 허용하기 때문에 발생
- PHANTOM READ
1. READ UNCOMMITTED
트랜잭션의 변경 내용이 COMMIT이나 ROLLBACK 여부에 상관없이 다른 트랜잭션에서 보이는 격리 수준이다. 따라서 DIRTY READ가 발생할 수 있다.
정합성에 문제가 많은 격리 수준이므로 최소한 READ COMMITTED를 사용해야 한다.
2. READ COMMITTED
- COMMIT이 완료된 데이터만 다른 트랜잭션에서 조회할 수 있는 격리 수준이다.
- DIRTY READ가 발생하지 않으며, 오라클 및 MS-SQL의 기본 격리 수준이다.
- MS-SQL은 변경하는 데이터에 대해서 row-level의 배타적 LOCK을 통해 READ COMMITTED를 격리성을 제공한다. 따라서 MS-SQL에서는 갱신중인 레코드는 읽지 못하고 대기하게 되므로 동시성 저하가 발생할 수 있다.
- 오라클 및 MySQL은 Undo 로그를 사용한 MVCC를 통해 LOCK 없이 일관성 있는 데이터 읽기가 가능하다.
한 트랜잭션에서 SELECT 결과가 서로 다른 NON-REPEATABLE READ가 발생할 수 있다.
3 REPEATABLE READ
- MySQL InnoDB 스토리지 엔진의 기본 격리 수준이다.
- REPEATABLE READ 격리 수준 이상을 사용하는 MySQL에서는 binlog format을 STATEMENT format을 사용할 수 있고, READ COMMITTED 격리 수준에서는 binlog format으로 ROW format 사용해야 한다.
- MySQL 및 오라클은 MVCC를 통해 언두 영역에 백업된 이전 데이터를 이용해 트랜잭션 시작 시점의 스냅샷을 복원하여 동일 트랜잭션 내에서는 여러 번 SELECT해도 동일한 결과를 보여줄 수 있다.
- REPEATABLE READ 구현을 위해 트랜젝션 내에서 참조된 데이터를 변경한 트랜잭션션의 UNDO LOG는 보존되어야 한다.
사용자가 BEGIN으로 트랜잭션을 시작하고 장시간 동안 트랜잭션을 종료하지 않으면 언두 영역이 무한정 커질 수도 있다. - MVCC 기능으로 인해 MySQL에서는 REPEATABLE READ에서도 SELECT에 있어서 PHANTOM READ가 발생하지 않는다 ( SELECT FOR UPDATE일 경우는 발생 가능)
4. SERIALIZABLE
가장 엄격한 격리 수준이다.
읽기 작업도 공유 잠금(읽기 잠금)을 획득해야 하며, 즉 한 트랜잭션에서 읽고 쓰는 레코드를 다른 트랜잭션에서는 절대 접근할 수 없다.
'MariaDB' 카테고리의 다른 글
MySQL/MariaDB Storage 엔진 비교 (0) | 2022.05.06 |
---|---|
MariaDB 이중화 구성 (2) | 2022.05.06 |