2009년 8월 25일 화요일

ORACLE_006. MONITORING LOCK CONTENTION - DML Lock

MONITORING LOCK CONTENTION - DML Lock                              

DML TRANSACTION은 한번에 최소 두개의 LOCK을 획득합니다.

 두종류의 LOCK이 DML 문(INSERT, UPDATE, DELETE or SELECT ... FOR UPDATE)에 사용됩니다.

      - SHARED LOCK & EXCLUSIVE LOCK

 

ENQUEUE MECHANISM

 오라클 서버는 ENQUEUE를 이용하여 모든 LOCK을 다룹니다. ENQUEUE는 다음을 기록합니다.

      - 다른 사용자가 가지고 있는 락을 획득하기 위해 대기중인 사용자

      - 사용자들이 요구하는 락 모드

      - 사용자가 락을 요청한 순서

 

 만약 세명의 사용자가 동시에 한개의 행에 대하여 UPDATE를 시도하면 세명은 모두 TABLE LOCK을 획득하게 됩니다. 하지만 오직 첫번째 UPDATE를 시도한 사용자만이 ROW LOCK을 획득합니다. Table-locking 메커니즘은 누가 Row Lock을 가지고 있는지와 누가 Row Lock 을 기다리고 있는지 기록합니다.

 

  DML_LOCKS 와 ENQUEUE_RESOURCES 파라메터를 증가시켜 인스턴스가 허용할 수 있는 LOCK의 최대 허용갯수를 늘릴 수 있습니다. 이는 PARALLEL SERVER 환경이 요구됩니다.

 

TABLE LOCK MODE

 오라클 서버에 의해 다음의 Table Lock은 자동으로 지정됩니다.

 

 Row Exclusive (RX) : INSERT, UPDATE, DELETE

 Row Share (RS) : SELECT ... FOR UPDATE

 

AUTOMATIC TABLE LOCK MODES

 Row Exclusive (RX)

  - 같은 테이블의 다른 행에 대하여 insert, update, delete 등의 쿼리를 허용합니다

  - 읽기나 쓰기를 위해 수동으로 테이블을 Lock 하는 Transaction 을 제한합니다.

 

  EXAMPLE)

 TRANSACTION 1          

TRANSACTION 2           

 UPDATE EMPLOYEE

 SET SALLARY=SALLARY *1.1                            

 WHERE ID=24877;

 1 Rows updated.

 UPDATE EMPLOYEE

 SET SALLARY=SALLARY*1.1                          

 WHERE ID=24878;

 1 Rows updated.

 

 Row Share (RS)

  - SELECT . . . FOR UPDATE 구문을 사용하여 쿼리를 수행할때 행을 Lock 할 수 있습니다.

  - 이는 Exclusive Write 를 위해 Table Lock을 수동으로 잡는 Transaction을 제한할 수 있습니다.

 

  EXAMPLE

 TRANSACTION 1          

TRANSACTION 2           

 SELECT ID, SALARY                                                

 FROM EMPLOYEE

 WHERE ID=28873

 FOR UPDATE;

 

       ID      SALARY

--------  ----------------

 28873               1100

 COMMIT;

 Commit complete.

 LOCK TABLE EMPLOYEE                             

   IN EXCLUSIVE MODE;

TRANSACTION2 WAITS.

 

 

Table(s) Locked

 

fin.

REF) Oracle9i Performance Tuning Volume I

 

참고) SELECT FOR UPDATE


 

댓글 없음:

댓글 쓰기