InnoDB에서는 4가지 Isolation Level을 지원한다.
1. READ UNCOMMITED
SELECT 명령문은 비-락킹 유형으로 실행되지만, 레코드의 예전 버전이 사용될 수도 있다. 따라서, 이러한 분리 레벨을 사용하면, 이러한 읽기 연산은 일관성을 갖지 못하게 된다. 이것을 소위 “더티 읽기 (dirty read)”라고 한다. 그렇지 않을 경우, 이러한 분리 레벨은 READ COMMITTED처럼 실행된다.
2. READ COMMITTED
오라클과 유사한 분리 레벨. 모든 SELECT ... FOR UPDATE 및 SELECT ... LOCK IN SHARE MODE 명령문은 인덱스 레코드만을 잠그지만, 인덱스 레코드 앞에 있는 갭은 잠그지 않으며, 따라서 새로운 레코드를 잠겨 있는 레코드 다음에 자유롭게 삽입하는 것을 허용한다. 유니크 검색 조건과 함께 유니크 인덱스를 사용하는 UPDATE 및 DELETE 명령문은 찾게 되는 인덱스만을 잠그며, 인덱스 잎에 있는 갭을 잠그지는 않는다. 범위-타입 UPDATE 및 DELETE 명령문의 경우, InnoDB는 반드시 다음-키 또는 갭 잠금을 설정하고 범위 내에 있는 갭에 대해서는 다른 사용자의 삽입을 막아야 한다. 이것은 MySQL 리플리케이션과 복구가 동작하기 위해서는 “팬텀 열 (phantom rows)”이 반드시 막혀야 하기 때문이다.
컨시스턴트 (consistent) 읽기 (consistent read)는 오라클과 동일한 동작을 실행한다: 각각의 컨시스턴트 (consistent) 읽기는, 동일한 트랜젝션 안에서라도, 자신의 최신 스냅샷을 설정하고 읽는다. Section 14.2.10.4, “컨시스턴트 (consistent) 비-락킹 (Non-Locking) 읽기”를 참조할 것.
3. REPEATABLE READ (Default)
이것은 InnoDB. SELECT ... FOR UPDATE, SELECT ... LOCK IN SHARE MODE, UPDATE의 디폴트 분리 레벨이며,유니크 검색 조건과 함께 유니크 인덱스를 사용하는 DELETE 명령문은 발견한 인덱스만을 잠그며, 그 앞에 있는 갭은 잠그지 않는다. 다른 검색 조건을 사용하면, 이러한 연산은 다음-키 락킹을 적용하고, 다음-키 또는 갭 잠금을 사용해서 스캔한 인덱스 범위 락킹을 하며, 다른 사용자의 새로운 삽입을 막아 버린다.
컨시스턴트 (consistent) 읽기의 경우, READ COMMITTED 분리 레벨과는 중요한 차이점이 존재한다: 동일 트랜젝션 내에서의 모든 컨시스턴트 (consistent) 읽기는 첫 번째 읽기에 의해 성립된 동일 스냅샷을 읽게 된다. 이것은, 만일 여러분이 몇몇 평이한 SELECT 명령문을 동일한 트랜젝션 안에 입력할 경우, 이러한 SELECT 명령문은 각각에 대해서도 일관성을 함께 가진다는 것을 의미하는 것이다. Section 14.2.10.4, “컨시스턴트 (consistent) 비-락킹 (Non-Locking) 읽기”를 참조할 것.
4. SERIALIZABLE
이 레벨은 REPEATABLE READ과 유사하지만, InnoDB는 암시적으로 모든 SELECT 명령문을 SELECT ... LOCK IN SHARE MODE에 대해서 실행한다.
No comments:
Post a Comment