MariaDB

트랜잭션 격리 수준(ISOLATION LEVEL)

my-log 2022. 5. 6. 17:41

트랜잭션의 격리 수준(Isolation Level)이란 여러 트랜잭션이 동시에 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 말지를 결정하는 것이다.

격리 수준 종류

1.READ UNCOMMITTED
2. READ COMMITTED
3. REPEATABLE READ
4. SERIALIZABLE

각 트랜잭션의 격리 수준에 따라 세가지 부정합이 생길 수 있다.

    1. DIRTY READ
      커밋되지 않은 데이터를 데이터를 다른 트랜잭션에서 읽는 상황
    1. NON-REPEATABLE READ
      한 트랜잭션에서 같은 쿼리를 두 번 수행할 때 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제함으로써 두 쿼리의 결과가 다르게 나타나는 현상
    1. 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