티스토리 뷰

데이터베이스/CUBRID

CUBRID Lock 분류

쌀맛나는세상 2009. 5. 18. 14:11

잠금 호환성

 

잠금 유지자(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


  • NULL_LOCK : 아무 잠금도 없는 상태.
  • IS_LOCK : 의도 공유 잠금.
  • 시스템은 클래스의 인스턴스 정의(스키마 정의)를 읽는 것은 허용하기 위해 클래스에 대해 IS_LOCK을 획득한다. 이 잠금은 클래스의 인스턴스에 대한 공유 잠금(S_LOCK)을 획득하여 몇몇의 인스턴스를 읽도록 허용한다. 클래스의 인스턴스에 공유잠금(S_LOCK)이 허용될 때마다 IS_LOCK도 클래스에 허용된다. 클래스에 대한 IS_LOCK은 다른 트랜잭션이 클래스의 모든 인스턴스를 갱신하거나 인스턴스의 클래스 정의(스키마 정의)를 갱신하는 것을 방지한다.
  • 인스턴스에 대한 IS_LOCK은 절대로 획득할 수 없는데, 그 이유는 인스턴스가 CUBRID 프로토콜에서 가장 작은 단위이기 때문이다.
  • IX_LOCK : 의도 배타 잠금.
  • 시스템은 클래스의 인스턴스 정의(스키마 정의)를 읽는 것은 허용하기 위해 클래스에 대해 IX_LOCK을 획득한다. 이 잠금은 클래스의 인스턴스에 대한 배타 잠금(공유 잠금)을 획득하여 클래스의 몇몇 인스턴스를 갱신하는 것(읽는 것)을 허용한다. X_LOCK이 클래스의 인스턴스에 허용될 때마다 IX_LOCK도 클래스에 대해 허용된다. 클래스에 대한 IX_LOCK은 다른 트랜잭션이 인스턴스의 클래스 정의(스키마 정의)를 갱신하고 클래스의 모든 인스턴스를 읽거나 갱신하는 것을 방지한다.
  • 인스턴스에 대한 IX_LOCK은 절대로 획득할 수 없는데, 그 이유는 인스턴스가 CUBRID 프로토콜에서 가장 작은 단위이기 때문이다.
  • S_LOCK : 공유 잠금.
  • 시스템은 클래스 인스턴스의 클래스 정의(스키마 정의)를 읽는 것은 허용하기 위해 클래스에 대해 S_LOCK을 획득한다. 이 잠금은 또한 모든 인스턴스에 대한 S_LOCK 획득 없이 클래스의 모든 인스턴스를 읽도록 허용한다. 클래스에 대한 S_LOCK은 다른 트랜잭션이 인스턴스의 스키마 정의와 클래스의 인스턴스의 어떤 값도 갱신할 수 없도록 방지한다.
  • 시스템은 인스턴스를 읽기 위해 그 인스턴스에 대해 S_LOCK을 획득한다. 이 경우 IS_LOCK은 인스턴스의 클래스에 대해 획득되어야 한다.
  • X_LOCK : 배타 잠금.
  • 시스템은 클래스 인스턴스의 클래스 정의(스키마 정의)를 갱신하는 것을 허용하기 위해 클래스에 대해 X_LOCK을 획득한다. 이 잠금은 인스턴스에 대한 X_LOCK (S_LOCK)을 획득할 필요없이 클래스의 모든 인스턴스를 갱신하는 것(읽는 것)을 허용한다. 클래스에 대한 X_LOCK은 다른 트랜잭션이 클래스 정의와 클래스의 어떤 인스턴스 값도 읽거나 갱신할 수 없도록 보호한다.
  • 시스템은 인스턴스를 갱신하기 위해 그 인스턴스에 대한 X_LOCK을 획득한다. 이 경우 IX_LOCK은 인스턴스의 클래스에 대해 획득되어야 한다.
  • SIX_LOCK : 공유 의도 배타 잠금.
  • 이 잠금은 S_LOCKIX_LOCK의 조합으로써 클래스에 대해 획득된다. 이 잠금은 클래스 인스턴스의 클래스 정의(스키마 정의)를 읽는 것과 인스턴스에 대한 S_LOCK 획득 없이 클래스의 모든 인스턴스를 읽는 것을 허용한다. 또한 이 인스턴스에 대한 X_LOCK을 획득하여 클래스의 몇몇 인스턴스를 갱신하는 것을 허용한다.
  • 인스턴스에 대한 SIX_LOCK은 절대로 획득할 수 없는데, 그 이유는 인스턴스가 CUBRID 프로토콜에서 가장 작은 단위이기 때문이다.
  • U_LOCK : 갱신 잠금.  
  • DELETE 문 또는 UPDATE 문의 수행은 삭제 또는 갱신하고자 하는 인스턴스들을 검색하여 읽은 후에, 그 인스턴스를 삭제하거나 그 인스턴스의 일부 값을 갱신한다. 인스턴스를 읽을 때에는 S_LOCK을 획득하고, 그 인스턴스가 삭제 또는 갱신의 대상이 되면 X_LOCK을 획득한다. 이 방식에서 동일한 인스턴스를 삭제 또는 갱신하고자 하는 트랜잭션이 두 개일 때, 둘 다 S_LOCK을 획득한 상태에서 X_LOCK을 요청하면 되면 두 트랜잭션은 교착 상태에 빠지게 된다.
  • U_LOCK 모드를 사용하면 이러한 교착 상태를 피할 수 있다. 삭제 또는 갱신의 목적으로 인덱스를 검색하여 인스턴스를 읽는 경우 S_LOCK 대신 U_LOCK을 획득하고, 그 인스턴스를 삭제 또는 갱신하는 경우 X_LOCK을 획득한다. U_LOCK은 서로 호환되지 않아서 동일 인스턴스에 대해 동시에 둘 이상의 트랜잭션이 U_LOCK을 획득할 수 없어기 때문에 트랜잭션들이 교착 상태에 빠지지 않고 직렬적으로 수행될 수 있다. 삭제 또는 갱신 목적으로 인덱스 검색을 통해 인스턴스를 검색하는 경우, 첫째 단계에서 인덱스 검색을 통해 키 범위와 키 필터를 만족하는 각 OID를 구하여 U_LOCK을 획득하며, 둘째 단계로 이들 중 삭제 또는 갱신 조건까지 만족하는 각 OID에 대하여 X_LOCK을 획득한다. 첫째 단계에서 U_LOCK을 획득하였지만 둘째 단계에서 데이터 필터조건을 만족하지 못하여 X_LOCK을 획득하지 못한 OID들에 대해서는 그 OID들에 잡혀 있는 U_LOCK을 모두 트랜잭션 격리 수준에 따라 S_LOCK으로 강등시키거나 해제한다.

scrap by cubrid document

참고