CUBRID는 수행되는 연산에 기초하여 획득할 필요가 있는 잠금을 결정한다. 사용자는 결코 획득할 잠금의 유형을 CUBRID에 지시할 수 없다. 잠금은 다른 트랜잭션이 요구된 데이터에 대한 잠금을 가지고 있는지, 그렇다면 그 트랜잭션이 가지고 있는 잠금 모드가 어떤 것인지에 따라 허용될 수 있다. 예를 들어 다른 트랜잭션이 원하는 데이터에 대한 배타 잠금을 가지고 있는 경우 요구되는 잠금은 요청한 트랜잭션에서는 허용될 수 없다.
아래의 잠금 호환성 테이블은 허용된 잠금이 어떤 요구된 잠금과 호환가능한지를 보여준다. 이 테이블은 트랜잭션 T1에서 현재 M1 모드의 잠금을 가지고 있을 때 M2 모드의 잠금이 트랜잭션 T2에서 허용될 수 있지 없는지를 나타낸다. 예를 들어 트랜잭션 T1이 X_LOCK을 가지고 있을 때 어떤 모드의 잠금도 다른 트랜잭션에 허용되지 않는다. 이 트랜잭션은 그 X_LOCK이 해제될 때까지 대기 상태로 가야 한다. 그러나 트랜잭션 T1이 S_LOCK을 가지고 있을 때 다른 트랜잭션 T2에는 IS_LOCK또는 S_LOCK이 허용된다. N/A는 '해당 없음'을 의미한다.
잠금 호환성
잠금 유지자(lock holder) |
||||||||
---|---|---|---|---|---|---|---|---|
NULL_LOCK |
IS_LOCK |
S_LOCK |
IX_LOCK |
SIX_LOCK |
U_LOCK |
X_LOCK |
||
잠금 요청자 (lock requester) |
NULL_LOCK |
TRUE |
TRUE |
TRUE |
TRUE |
TRUE |
TRUE |
TRUE |
IS_LOCK |
TRUE |
TRUE |
TRUE |
TRUE |
TRUE |
N/A |
FALSE |
|
S_LOCK |
TRUE |
TRUE |
TRUE |
FALSE |
FALSE |
FALSE |
FALSE |
|
IX_LOCK |
TRUE |
TRUE |
FALSE |
TRUE |
FALSE |
N/A |
FALSE |
|
SIX_LOCK |
TRUE |
TRUE |
FALSE |
FALSE |
FALSE |
N/A |
FALSE |
|
U_LOCK |
TRUE |
N/A |
TRUE |
N/A |
N/A |
FALSE |
FALSE |
|
X_LOCK |
TRUE |
FALSE |
FALSE |
FALSE |
FALSE |
FALSE |
FALSE |
다음은 격리 수준을 REPEATABLE READ CLASS with READ COMMITTED INSTANCES 로 설정하였고, AUTOCOMMIT을 OFF 로 (;autocommit off) 설정한 상태이다.
두 사용자가 동시에 동일한 클래스에 접근하려고 시도한다고 가정하자. T1은 한 클래스의 데이터에 질의를 할 필요가 있고 반면에 T2는 이미 T1이 질의문에 선택한 속성 중 하나를 갱신하고 있다. (T2 에서 ------ 1st 까지 실행)
User 1 (T1):
;autocommit off
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ CLASS, READ COMMITTED INSTANCES;
select host_year, nation_code, gold from participant where gold > 10 and host_year >= 2000;
;xrun
User 2 (T2):
;autocommit off
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ CLASS, READ COMMITTED INSTANCES;
update participant
set gold = 11
where nation_code = 'KOR' and host_year=2000;
;xrun
------ 1st
update participant
set gold = 29
where nation_code = 'RUS' and host_year=2004;
update participant
set gold = 37
where nation_code = 'USA' and host_year=2004;
commit work;
;xrun
이 경우 일관성을 유지하기 위해 데이터에 접근 가능할 때까지 트랜잭션 T1을 대기시킨다. 트랜잭션 T2에서 갱신된 인스턴스는 T2가 커밋된 후에 트랜잭션 T1에서 읽기가 가능하다. 트랜잭션 T2가 커밋되거나 롤백되자마자 CUBRID는 트랜잭션 T2가 획득한 잠금을 해제하고 트랜잭션 T1이 계속 진행할 수 있게 허용한다. 트랜잭션 T2에서 있었던 변경이 영구화되면 트랜잭션 T1은 갱신된 데이터에 접근할 수 있다.