제12장 DBMS_LOCK

내용 목차

12.1. 개요
12.2. 프러시저
12.2.1. ALLOCATE_UNIQUE
12.2.2. CONVERT
12.2.3. RELEASE
12.2.4. REQUEST
12.2.5. SLEEP

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

12.1. 개요

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; 

12.2. 프러시저

본 절에서는 DBMS_LOCK 패키지에서 제공하는 프러시저를 알파벳 순으로 설명한다.

12.2.1. ALLOCATE_UNIQUE

지정된 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;
    /

12.2.2. CONVERT

기존 Lock 모드에서 다른 Lock 모드로 변경하기 위한 프러시저이다.

CONVERT 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    DBMS_LOCK.CONVERT
    (
        id         IN INTEGER || 
        lockhandle IN VARCHAR2,
        lockmode   IN INTEGER,
        timeout    IN NUMBER DEFAULT MAXWAIT
    ) 
    RETURN INTEGER;
  • 파라미터

    파라미터설명
    id or lockhandleLock 모드를 변경하기 위한 Lock ID 또는 handle이다.
    lockmode변경할 새로운 Lock 모드이다.
    timeout

    Lock 모드 변경을 위해 기다릴 시간을 설정한다.

    만약 Lock을 얻을 수 없다면 timeout 에러 값을 리턴한다. (단위: 초)

  • 반환값

    반환값설명
    0Success
    1Timeout
    2Deadlock
    3Parameter error
    4Owner error
    5Illegal lock handle
  • 예제

    BEGIN
        DBMS_LOCK.CONVERT(lock_handle, DBMS_LOCK.X_MODE, 600);
    END;
    /

12.2.3. RELEASE

기존 잡았던 Lock을 명시적으로 해제하기 위한 프러시저이다. 기본적으로 Lock은 세션이 종료되면 자동적으로 해제된다.

RELEASE 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    DBMS_LOCK.RELEASE
    (
        id         IN INTEGER || 
        lockhandle IN VARCHAR2
    ) 
    RETURN INTEGER;
  • 파라미터

    파라미터설명
    id or lockhandleLock을 해제하기 위한 Lock ID 또는 handle이다.
  • 반환값

    반환값설명
    0Success
    3Parameter error
    4Owner error
    5Illegal lock handle
  • 예제

    BEGIN
        DBMS_LOCK.RELEASE(lock_handle);
    END;
    /

12.2.4. REQUEST

원하는 Lock 모드를 지정하여 Lock을 요청하기 위한 프러시저이다.

REQUEST 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    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 lockhandleLock을 요청하기 위한 Lock ID 또는 handle이다.
    lockmode요청하는 Lock 모드이다.
    timeout

    Lock 얻기 위해 기다릴 시간이다. (단위: 초)

    만약 Lock을 얻을 수 없다면 timeout 에러 값을 리턴한다.

    release_on_commit
    • TRUE: commit이나 rollback할 때 Lock이 해제된다.

    • FALSE: 명시적으로 Lock을 해제하거나 세션이 종료될 때까지 Lock을 해제하지 않는다.

  • 반환값

    반환값설명
    0Success
    1Timeout
    2Deadlock
    3Parameter error
    4Already owned by id or lockhandle
    5Illegal lock handle
  • 예제

    BEGIN
        DBMS_LOCK.REQUEST(lock_handle, DBMS_LOCK.S_MODE, DBMS_LOCK.MAXWAIT, TRUE);
    END;
    /

12.2.5. SLEEP

현재 세션을 일정 시간만큼 대기시킨다.

SLEEP 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    DBMS_LOCK.SLEEP
    (
        seconds        IN         NUMBER
    )
  • 파라미터

    파라미터설명
    seconds대기 시간(초)이다.
  • 예제

    DECLARE
       second NUMBER;
    BEGIN
       second := 0.11;
       DBMS_LOCK.SLEEP(second);
    END;
    /