제17장 DBMS_LOCK

내용 목차

17.1. 개요
17.2. 프러시저
17.2.1. ALLOCATE_UNIQUE
17.2.2. CONVERT
17.2.3. RELEASE
17.2.4. REQUEST
17.2.5. SLEEP

본 장에서는 DBMS_LOCK 패키지의 기본 개념과 패키지 내의 프러시저를 사용하는 방법을 설명한다.

DBMS_LOCK은 유저에게 Lock 관리 및 SLEEP 기능을 제공하는 패키지이다. 이 패키지는 디폴트로 관리자만 수행 가능하다.

DBMS_LOCK 패키지에서는 아래 테이블에 정의된 상수를 사용한다.

이름별칭타입
NS_MODENullINTEGER1
SS_MODESub sharedINTEGER2
SX_MODESub eXclusive or Row Exclusive ModeINTEGER3
S_MODEShared or Row Exclusive Mode or Intended ExclusiveINTEGER4
SSX_MODEShared Sub eXclusive or Shared Row Exclusive ModeINTEGER5
X_MODEExclusiveINTEGER6

다른 스레드에서 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;
    /