내용 목차
본 장에서는 DBMS_LOCK 패키지의 기본 개념과 패키지 내의 프러시저를 사용하는 방법을 설명한다.
DBMS_LOCK은 유저에게 Lock 관리 및 SLEEP 기능을 제공하는 패키지이다. 이 패키지는 디폴트로 관리자만 수행 가능하다.
DBMS_LOCK 패키지에서는 아래 테이블에 정의된 상수를 사용한다.
이름 | 별칭 | 타입 | 값 |
---|---|---|---|
NS_MODE | Null | INTEGER | 1 |
SS_MODE | Sub shared | INTEGER | 2 |
SX_MODE | Sub eXclusive or Row Exclusive Mode | INTEGER | 3 |
S_MODE | Shared or Row Exclusive Mode or Intended Exclusive | INTEGER | 4 |
SSX_MODE | Shared Sub eXclusive or Shared Row Exclusive Mode | INTEGER | 5 |
X_MODE | Exclusive | INTEGER | 6 |
다른 스레드에서 lock을 잡고 있는 경우, 아래 호환성 표에 따라 요청 결과가 결정된다.
모드 | NL 요청 | SS 요청 | SX 요청 | S 요청 | SSX 요청 | X 요청 |
---|---|---|---|---|---|---|
NL | 성공 | 성공 | 성공 | 성공 | 성공 | 성공 |
SS | 성공 | 성공 | 성공 | 성공 | 성공 | 실패 |
SX | 성공 | 성공 | 성공 | 성공 | 실패 | 실패 |
S | 성공 | 성공 | 실패 | 성공 | 실패 | 실패 |
SSX | 성공 | 성공 | 실패 | 실패 | 실패 | 실패 |
X | 성공 | 실패 | 실패 | 실패 | 실패 | 실패 |
상수 MAXWAIT으로 설정할 경우 영원히 기다린다.
maxwait constant pls_integer := 32767;
본 절에서는 DBMS_LOCK 패키지에서 제공하는 프러시저를 알파벳 순으로 설명한다.
지정된 lockname에 Lock ID를 할당하는 프러시저이다. Lock ID 값의 범위는 1073741824 에서 1999999999까지이다. 사용자에게 숫자가 아닌 이름을 통해서 관리를 쉽게하기 위한 목적으로 제공한다.
ALLOCATE_UNIQUE 프러시저의 세부 내용은 다음과 같다.
프로토타입
DBMS_LOCK.ALLOCATE_UNIQUE ( lockname IN VARCHAR2, lockhandle OUT VARCHAR2, expiration_secs IN PLS_INTEGER DEFAULT 864000 )
파라미터
파라미터 | 설명 |
---|---|
lockname | 유일한 lockhandle 값을 생성할 Lock 이름을 지정한다. |
lockhandle | 생성된 Lock ID에 대한 handle을 리턴받는다. 이 handle 값을 통해 REQEST, CONVERT, RELEASE 프러시저를 호출할 수 있다. Lock ID를 잘못 사용했을 때의 문제를 방지하기 위해 Lock ID를 직접 리턴하는 대신 VARCHAR2 (128) 변수로 설정된 handle 값을 리턴한다. handle은 한 세션에서만 유효하므로 다른 세션에서 해당 값을 사용해서는 안 된다. |
expiration_secs | DBMS_LOCK_ALLOCATED 테이블을 재활용하기 위한 유효 시간을 초단위로 지정한 값이다. (기본값: 10일) 마지막 ALLOCATE_UNIQUE 프러시저를 호출한 시점이후로 지나간 시간을 계산한다. DBMS_LOCK_ALLOCATED 테이블에서 Lock을 직접 삭제해서는 안 된다. _DBMS_LOCK_REUSE 초기화 파라미터를 Y로 설정한 경우에만 동작한다. |
예제
DECLARE lock_handle VARCHAR2(128); BEGIN DBMS_LOCK.ALLOCATE_UNIQUE('my_lock', lock_handle); END; /
기존 Lock 모드에서 다른 Lock 모드로 변경하기 위한 프러시저이다.
프로토타입
DBMS_LOCK.CONVERT ( id IN INTEGER || lockhandle IN VARCHAR2, lockmode IN INTEGER, timeout IN NUMBER DEFAULT MAXWAIT ) RETURN INTEGER;
파라미터
파라미터 | 설명 |
---|---|
id or lockhandle | Lock 모드를 변경하기 위한 Lock ID 또는 handle이다. |
lockmode | 변경할 새로운 Lock 모드이다. |
timeout | Lock 모드 변경을 위해 기다릴 시간을 설정한다. 만약 Lock을 얻을 수 없다면 timeout 에러 값을 리턴한다. (단위: 초) |
반환값
반환값 | 설명 |
---|---|
0 | Success |
1 | Timeout |
2 | Deadlock |
3 | Parameter error |
4 | Owner error |
5 | Illegal lock handle |
예제
BEGIN DBMS_LOCK.CONVERT(lock_handle, DBMS_LOCK.X_MODE, 600); END; /
기존 잡았던 Lock을 명시적으로 해제하기 위한 프러시저이다. 기본적으로 Lock은 세션이 종료되면 자동적으로 해제된다.
프로토타입
DBMS_LOCK.RELEASE ( id IN INTEGER || lockhandle IN VARCHAR2 ) RETURN INTEGER;
파라미터
파라미터 | 설명 |
---|---|
id or lockhandle | Lock을 해제하기 위한 Lock ID 또는 handle이다. |
반환값
반환값 | 설명 |
---|---|
0 | Success |
3 | Parameter error |
4 | Owner error |
5 | Illegal lock handle |
예제
BEGIN DBMS_LOCK.RELEASE(lock_handle); END; /
원하는 Lock 모드를 지정하여 Lock을 요청하기 위한 프러시저이다.
프로토타입
DBMS_LOCK.REQUEST ( id IN INTEGER || lockhandle IN VARCHAR2, lockmode IN INTEGER DEFAULT X_MODE, timeout IN INTEGER DEFAULT MAXWAIT, release_on_commit IN BOOLEAN DEFAULT FALSE ) RETURN INTEGER;
파라미터
파라미터 | 설명 |
---|---|
id or lockhandle | Lock을 요청하기 위한 Lock ID 또는 handle이다. |
lockmode | 요청하는 Lock 모드이다. |
timeout | Lock 얻기 위해 기다릴 시간이다. (단위: 초) 만약 Lock을 얻을 수 없다면 timeout 에러 값을 리턴한다. |
release_on_commit |
|
반환값
반환값 | 설명 |
---|---|
0 | Success |
1 | Timeout |
2 | Deadlock |
3 | Parameter error |
4 | Already owned by id or lockhandle |
5 | Illegal lock handle |
예제
BEGIN DBMS_LOCK.REQUEST(lock_handle, DBMS_LOCK.S_MODE, DBMS_LOCK.MAXWAIT, TRUE); END; /