isolation_level 시스템 매개변수와 SET TRANSACTION 문으로 원하는 격리 수준을 설정할 수 있다. 처음 CUBRID 설치 시 cubrid.conf에 설정된 격리 수준은 REPEATABLE READ CLASS, READ UNCOMMITTED INSTANCES이며, 격리 수준이 설정되지 않으면 트랜잭션의 기본 격리 수준은 REPEATABLE READ CLASS, READ COMMITTED INSTANCES 이다.isolation_level은 클래스(스키마)와 인스턴스의 조합에 적용된다.
SET TRANSACTION ISOLATION LEVEL isolation_level_spec [ ; ]
isolation_level_spec:
_ SERIALIZABLE
_ CURSOR STABILITY
_ isolation_level [ { CLASS | SCHEMA } [ , isolation_level INSTANCES ] ]
_ isolation_level [ INSTANCES [ , isolation_level { CLASS | SCHEMA } ] ]
_ variable
isolation_level:
_ REPEATABLE READ
_ READ COMMITTED
_ READ UNCOMMITTED
다음의 명령문은 클래스와 인스턴스에 반복 가능한 읽기 격리 수준을 설정한다.
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ CLASS, REPEATABLE READ INSTANCES
몇몇 격리 수준의 조합은 CUBRID에서 허용되지 않는다. 유효하지 않은 격리 수준은 지원하지 않는 격리 수준 조합에서 논의한다. 다음의 표는 SET TRANSACTION 문으로 설정할 수 있는 격리 수준의 여러 조합들에 대한 간략한 설명을 제공한다.
CUBRID가 지원하는 격리 수준
격리 수준 이름 |
설명 |
---|---|
SERIALIZABLE |
이 격리 수준에서는 모든 동시성 관련 문제들(더티 읽기, 반복 불가능한 읽기, 유령 읽기)이 발생하지 않는다 |
REPEATABLE READ CLASS with REPEATABLE READ INSTANCES |
이 격리 수준에서는 다른 트랜잭션에 의해 수정 중인 객체를 읽지 않으며, 인스턴스 들에 대한 반복 불가능한 읽기를 하지 않는다. 현재 트랜잭션이 읽은 객체(클래스 혹은 인스턴스) 들에 대해 다른 트랜잭션이 갱신 연산을 수행하지 못한다. 특정 조건을 만족하는 인스턴스들에 대한 검색은 유령 읽기가 발생할 수 있다. |
REPEATABLE READ CLASS with READ COMMITTED INSTANCES (or CURSOR STABILITY) |
이 격리 수준에서는 다른 트랜잭션에 의해 수정 중인 객체를 읽지 않으며, 트랜잭션이 접근 중인 클래스(스키마의 일부)를 다른 트랜잭션이 갱신하지 못하도록 한다. 트랜잭션은 인스턴스에 대한 반복 불가능한 읽기를 경험할 수도 있다. 같은 객체를 두 번 읽는 경우 그 객체의 다른 두 (커밋된) 값을 읽을 수 있음을 의미한다. |
REPEATABLE READ CLASS with READ UNCOMMITTED INSTANCES |
이 격리 수준에서는 다른 트랜잭션에 의해 수정 중인 클래스를 읽지 않으며, 트랜잭션이 접근중인 클래스(스키마의 일부분)를 다른 트랜잭션이 갱신하지 못하도록 한다. 이 격리 수준은 트랜잭션이 커밋된 인스턴스 뿐만 아니라 이후에 갱신되거나 롤백될 수 있는 커밋되지 않은 더티 인스턴스를 읽을 수 있도록 허용한다. |
READ COMMITTED CLASS with READ COMMITTED INSTANCES |
이 격리 수준에서는 다른 트랜잭션에 의해 수정 중인 객체(클래스 또는 인스턴스)를 읽지 않는다. 읽혀진 클래스나 인스턴스를 다른 트랜잭션이 갱신하지 못하게 막지 않는다. 트랜잭션은 클래스(스키마)와 인스턴스에 대한 읽기가 반복 불가능할 수 있다. |
READ COMMITTED CLASS with READ UNCOMMITTED INSTANCES |
이 격리 수준에서는 다른 트랜잭션에 의해 수정 중인 클래스를 읽지 않으며, (커밋된 값들을 읽는 것에 추가로) 더티 인스턴스를 읽는다. 트랜잭션은 클래스(스키마)와 인스턴스에 대한 읽기가 반복 불가능할 수 있다. |
일단 새로운 격리 수준이 설정되면, 트랜잭션의 남은 부분은(다른 격리 수준이 설정되기 전까지) 설정된 격리 수준을 사용되게 된다. 다른 격리 수준이 설정되기 전에는, 수정된 격리 수준이 이후의 트랜잭션에 적용된다. 격리 수준을 갱신할 필요가 있으면 트랜잭션의 시작 시점(커밋, 롤백, 또는 시스템 재시작 이후)에 하는 것이 좋다. 어떤 격리 수준이 트랜잭션의 진행 중에 설정되면 트랜잭션이 획득한 몇몇 자원(잠금)이 새로운 격리 수준이 설정되는 동안에 해제될 수 있다. 이 경우 하나의 격리 수준이 트랜잭션 전체에 계속 적용된다고 가정하면 안 된다.
예를 들어, 초기 격리 수준이 READ COMMITTED CLASS with READ UNCOMMITTED INSTANCES였는데 트랜잭션 중간에 REPEATABLE READ CLASS with REPEATABLE READ INSTANCES (SERIALIZABLE)로 바뀌면 새로운 격리 수준이 설정되기 전에 트랜잭션에서 발생할 수 있는 몇몇 읽기 때문에 전체 트랜잭션이 SERIALIZABLE하지 않을 수 있다. 일반적으로 최소한의 제한적인 격리 수준이 전체 트랜잭션에 영향을 준다고 가정하면 안전하다.