내용 목차
본 장에서는 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; /