콘텐츠로 이동

LOCK TABLE

LOCK TABLE#

구문#

lock_table ::=#

전제 조건#

SYS 사용자, 테이블의 소유자와 LOCK ANY TABLE 시스템 권한을 가진 사용자만이 이 구문으로 테이블을 잠글수있다.

설명#

lock_mode에 명시한 잠금 모드로 특정한 모드 내에서 테이블 잠금(lock table)을 설정하는 기능이다. 테이블에 잠금이 걸리면 관련 트랜잭션이 커밋되거나 롤백될 때까지 계속 그 잠금이 유지된다.

user_name#

잠금이 걸릴 테이블의 소유자 이름을 명시한다. 생략하면 Altibase는 그 테이블이 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다.

tbl_name#

잠금이 걸릴 테이블의 이름을 명시한다.

partition_name#

잠금이 걸릴 파티션의 이름을 명시한다. 파티션의 이름을 명시하면, 파티션에 잠금 모드를 적용하고 테이블에는 ROW SHARE 또는 ROW EXCLUSIVE를 적용한다.

잠금 모드 파티션 적용 테이블 적용
ROW SHARE ROW SHARE ROW SHARE
SHARE UPDATE SHARE UPDATE ROW SHARE
ROW EXCLUSIVE ROW EXCLUSIVE ROW EXCLUSIVE
SHARE ROW EXCLUSIVE SHARE ROW EXCLUSIVE ROW EXCLUSIVE
SHARE SHARE ROW SHARE
EXCLUSIVE EXCLUSIVE ROW EXCLUSIVE

lock_mode#

테이블 잠금을 설정할 때, 다음의 잠금 모드 중에서 하나를 명시해야 한다.

  • ROW SHARE
    이 모드로 잠금이 설정된 테이블에 다른 트랜잭션에 의한 동시 접근을 허용한다. 그러나 다른 사용자들이 독점적인 접근을 위해 이 테이블에 EXCLUSIVE 모드로 잠금을 거는 것은 금한다.
  • SHARE UPDATE
    ROW SHARE와 동일한 기능의 잠금 모드이다.
  • ROW EXCLUSIVE
    이 모드로 잠금이 설정된 테이블에 다른 트랜잭션에 의한 동시 접근을 허용한다. 그러나 다른 사용자들이 독점적인 접근을 위해 이 테이블에 EXCLUSIVE 또는 SHARE 모드로 잠금을 거는 것은 금한다. 데이터를 갱신, 삽입하거나 또는 삭제할 때 자동으로 이 잠금이 획득된다.
  • SHARE ROW EXCLUSIVE
    다른 트랜잭션이 이 모드로 잠금이 설정된 테이블을 읽는 것이 허용된다. 그러나 다른 사용자들이 독점적인 접근을 위해 이 테이블에 SHARE 모드로 잠금을 거는 것은 금한다.
  • SHARE
    다른 트랜잭션이 이 모드로 잠금이 걸린 테이블을 읽는 것은 허용하지만 갱신하는 것은 금한다.
  • EXCLUSIVE
    현재 트랜잭션이 이 모드로 잠금이 걸린 테이블을 읽거나 갱신하는 것은 허용하지만, 다른 트랜잭션은 불가하다.

WAIT | NOWAIT#

잠금이 획득될 때까지 대기할 지 여부를 지정하는 옵션이다. 생략하면, 행 단위 잠금이 획득될 때까지 무한정 기다린다.

  • WAIT n
    트랜잭션이 행 단위 잠금(row lock)이 걸리기까지 n 초 만큼 기다리고도 획득에 실패하면 에러가 반환될 것이다.
  • NOWAIT
    트랜잭션이 잠금 획득이 즉시 안 될 경우 행 단위 잠금이 걸리기까지 기다리지 않는다. 이 경우 이미 다른 사용자에 의해서 해당 테이블에 이미 잠금이 걸려 있다는 것을 나타내는 에러를 반환한다.

UNTIL NEXT DDL#

세션이 NON-AUTOCOMMIT 모드일 때 테이블에 DDL(데이터 정의어)을 수행하면, DDL이 실행되기 직전에 자동으로 커밋을 수행한다.

그러나 lock_mode에서 EXCLUSIVE 모드를 지정하고 이 절을 실행하면, DDL을 수행하기 직전에 자동으로 커밋을 수행하지 않는다. 이 기능은 하나의 트랜잭션에 한 번만 수행할 수 있다.

SQL Statement

Mode of Table Lock

Lock Modes Permitted?

IS

IX

S

SIX

X

SELECT … FROM tbl_name

IS

Y(IS)

Y(IX)

Y(S)

Y(SIX)

N(X)

INSERT INTO tbl_name

IX

Y(IX)

Y(IX)

N(SIX)

N(SIX)

N(X)

UPDATE tbl_name …

IX

Y*(IX)

Y*(IX)

N(SIX)

N(SIX)

N(X)

DELETE FROM tbl_name

IX

Y*(IX)

Y*(IX)

N(SIX)

N(SIX)

N(X)

SELECT … FROM tbl_name FOR UPDATE …

IS

Y*(IX)

Y*(IX)

Y*(S)

Y*(SIX)

N(X)

LOCK TABLE tbl_name IN ROW SHARE MODE

IS

Y(IS)

Y(IX)

Y(S)

Y(SIX)

N(X)

LOCK TABLE tbl_name IN ROW EXCLUSIVE MODE

IX

Y(IX)

Y(IX)

N(SIX)

N(SIX)

N(X)

LOCK TABLE tbl_name IN SHARE MODE

S

Y(S)

N(SIX)

Y(S)

N(SIX)

N(X)

LOCK TABLE tbl_name IN SHARE ROW EXCLUSIVE MODE

SIX

Y(SIX)

N(SIX)

N(SIX)

N(SIX)

N(X)

LOCK TABLE tbl_name IN EXCLUSIVE MODE

X

N(X)

N(X)

N(X)

N(X)

N(X)

IS: row share (Intent share lock)

IX: row exclusive (Intent exclusive lock)

S: share

SIX: share row exclusive (Share with Intent exclusive lock)

X: exclusive

* Y: 다른 트랜잭션에 의해 행 잠금 충돌이 일어나지 않은 경우, 그 트랜잭션은 잠금 획득이 가능하다. 그렇지 않으면 기다림이 발생한다.

 

괄호 내에 표시된 잠금 타입은:

1. 다른 트랜잭션에 의해 현재의 잠금 모드 전환이 허용되는 경우(Y), 현재 걸려있는 잠금 타입이 괄호 안의 타입으로 전환된다.

2. 다른 트랜잭션에 의해 현재의 잠금 모드 전환이 허용되지 않는 경우(N), 잠금 타입은 현재 잠금을 획득하고 있는 트랜잭션이 새로운 잠금을 획득할 때만 괄호 안의 타입으로 전환이 가능하다.

[표 4‑1] Summary of Table Locks

예제#

다음은 LOCK TABLE과 SELECT 문이 사용 될 때 Altibase가 데이터 동시성, 무결성, 그리고 일관성을 어떻해 관리하는가를 보여주는 예제이다.

Transaction A Time Point Transaction B
iSQL> AUTOCOMMIT OFF;
Set autocommit off success.
iSQL> AUTOCOMMIT OFF;
Set autocommit off success.
1 (request X lock on employees)
iSQL> LOCK TABLE employees IN EXCLUSIVE MODE;
Command execute success.
(acquire X lock on employees)
iSQL> DROP TABLE employees;
[ERR-11170: The transaction has exceeded the lock timeout specified by the user.]
2
3 iSQL> UPDATE employees SET salary = 2500000 WHERE eno = 15;
1 row updated.
(request S lock on employees)
iSQL> LOCK TABLE employees IN SHARE MODE;
(the request conflicts with the X lock already held by transaction B)
wait
wait
wait
4
5 iSQL> COMMIT;
Commit success.
(release X lock on employees)
(resume)
Lock success.
(acquire S lock on employees)
iSQL> SELECT salary FROM employees WHERE eno = 15;
SALARY
--------------
2500
row selected.
(커밋된 데이터가 보인다.)
6
iSQL> ROLLBACK;
Rollback success.
(release S lock on employees)
7
iSQL> LOCK TABLE employees IN EXCLUSIVE MODE;
Lock success.
(acquire X lock on employees)
8
iSQL> SELECT SALARY FROM employees WHERE eno = 15;
wait
wait
wait
iSQL> UPDATE employees SET eno = 30 WHERE eno = 15;
1 row updated.
10
iSQL> COMMIT;
Commit success.
(release X loc on employees)
11
12 (resume)
SALARY
--------------
2500
1 row selected.