

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 격리 수준 정의
<a name="transactions-isolation-levels"></a>

`ACID`의 "I"는 *격리(isolation)*의 약자입니다. 트랜잭션의 격리 정도에 따라 다른 동시 트랜잭션이 기반이 되는 데이터에 어느 정도 영향을 미칠 수 있는지 결정됩니다.

[SQL:1992 표준](http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt)은 격리 수준을 설명하기 위한 용어를 만들었습니다. 2개의 동시 트랜잭션 사이에서 발생할 수 있는 세 유형의 상호 작용(이를 *현상*이라고 함) `Tx1`과 `Tx2`를 다음과 같이 정의합니다.
+ `Dirty read` – 이 현상은 `Tx1`이 항목을 수정하고 `Tx1`가 변경을 커밋하기 전에 `Tx2`가 해당 항목을 읽을 때 발생합니다. 그리고 `Tx1`이 변경 커밋에 성공하거나 롤백한 적이 없다면 `Tx2`이 데이터베이스로 읽어온 적이 없는 값을 읽어왔을 것입니다.
+ `Non-repeatable read` – `Tx1`이 어떤 항목을 읽었는데 `Tx2`가 해당 항목을 수정 또는 삭제하고 변경을 커밋하고 `Tx1`가 해당 항목에 대한 다시 읽기를 시도하자 `Tx1`이 이전과 다른 값을 읽어들이거나 해당 항목이 더 이상 존재하지 않는다는 것을 확인할 때 이런 현상이 발생합니다.
+ `Phantom read` – `Tx1`이 검색 기준을 충족하는 항목 집합을 읽었는데 `Tx2`가 검색 기준을 충족하는 새로운 항목을 추가하고 `Tx1`가 검색을 반복하자 `Tx1`이 이전과는 다른 항목 집합을 얻게 될 때 이런 현상이 발생합니다.

이러한 세 가지 유형의 상호 작용은 제각기 데이터베이스의 결과 데이터에서 비일관성 문제를 야기할 수 있습니다.

SQL:1992 표준은 세 가지 유형의 상호 작용과 이로 인해 야기될 수 있는 비일관성 측면에서 서로 다른 보장이 제공되도록 4가지 격리 수준을 정의했습니다. 4가지 수준 모두에서 트랜잭션은 완벽하게 실행되도록 보장되거나 전혀 실행되지 않을 수 있습니다.
+ `READ UNCOMMITTED` – 세 유형의 상호 작용(더티 읽기, 비반복적 읽기, 가상 읽기)이 모두 허용됩니다.
+ `READ COMMITTED` – 더티 읽기는 불가능하지만, 비반복적 읽기와 가상 읽기는 가능합니다.
+ `REPEATABLE READ` – 더티 읽기와 비반복적 읽기는 불가능하지만, 가상 읽기는 여전히 가능합니다.
+ `SERIALIZABLE` – 세 유형의 상호 작용 현상이 절대 발생할 수 없습니다.

다중 버전 동시성 제어(MVCC)를 사용하면 *SNAPSHOT* 격리라는 다른 종류의 격리를 사용할 수 있습니다. 이는 트랜잭션이 시작할 때 존재했던 데이터의 스냅샷에서 트랜잭션이 작동하고 다른 트랜잭션은 해당 스냅샷을 변경할 수 없도록 보장합니다.