2009년 8월 25일 화요일

ORACLE_005. MONITORING LOCK CONTENTION - Lock Mechanism

MONITORING LOCK CONTENTION - Lock Mechanism                     

LOCK MANAGEMENT

 오라클 서버는 자동으로 락을 제어합니다. 최하위의 기본적인 락 메커니즘은 높은 수준에서의 데이터 작업에서 읽기 일관성을 제공합니다.

 

  NOTE 기본 메커니즘은 ROW_LOCKING을 이용해 변경할 수 있습니다. 기본값은 ALWAYS 이고 DML 구문이 실행될 때 최소한의 레벨에 락을 겁니다.  다른 가능한 값으로 INTENT 가 있는데 이는 좀더 상위의 레벨에 대해 락을 겁니다(TABLE LEVEL, 단 SELECT FOR UPDATE 구문은 제외).

 

QUIESCED DATABASE

 DBA는 시스템을 QUIESCED(얼어버린 상태, 즉 변경 불가능 상태란 이야기죠) 상태로 변경할 수 있습니다. SYS와 SYSTEM을 제외한 어떠한 세션도 존재하지 않다면 시스템은 QUIESCED 상태가 됩니다. 현제 진행중인 트랜젝션, 쿼리, 페치( FETCH), PL/SQL 프로시져나 공유 자원을 가지고 있는 ACTIVE 세션은 큐(QUEUE)에 들어갑니다. 오직 DBA만이 시스템을 QUIESCE 상태로 변경 가능 합니다.

 

DATA CONCURRENCY

 락은 높은 수준의 데이터 작업을 가능하게 디자인 되어 있습니다. 즉 많은 사람들이 동시에 같은 데이터에 접근이 가능합니다.

 

  - Data Manupulationg Language (DML) 은 Low Level 락 입니다.    

 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.

 

 TRANSACTION 1          

TRANSACTION 2           

 UPDATE EMPLOYEE                            

 SET SALLARY=SALLARY + 1200;                                  

 13120 rows updated.

 SELECT SALARY

 FROM EMPLOYEE                                                 

 WHERE ID = 10;   

              SALARY

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

                    10000

DURATION 

 LOCK은 TRANSACTION이 COMMIT, ROLLBACK, 혹은 TERMINATE 될 때까지 유지됩니다. TRANSACTION이 비정상 종료 된다면 PROCESS MONITOR가 이를 감지하고 LOCK을 해제합니다.

 

LOCKING MODE

 EXCLUSIVE LOCK

  Exclusive Lock 은 공유된 자원이 Exclusive Lock이 해제되기 전까지 못 사용하게 합니다.

  Example ) Exclusive Lock 은 Row Level 의 DML Transaction 에서 SET 됩니다.

 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=24877;

Transactions 2 waits.

 

 SHARED LOCK

  수개의 Transaction 은 같은 자원에 Shared Lock을 겁니다.

  Example ) Shared Lock 은 테이블 레벨의 DML Transaction에서 SET 됩니다.

 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

 

LOCK DURATION

 우선적으로 LOCK 을 잡은 TRANSACTION이 COMMIT, 혹은 ROLL BACK 할 동안 입니다.

 TRANSACTION 1          

TRANSACTION 2           

 UPDATE EMPLOYEE                            

 SET SALLARY=SALLARY * 1.1                                      

 WHERE ID=24877;                                  

 1 rows updated.

 COMMIT;

 Commit complete.

 UPDATE EMPLOYEE

 SET SALLARY=SALLARY*1.1                               

 WHERE ID=24877;

 Transactions 2 waits until transaction 1

 is committed.

 1 rows updated.

 

 

Fin.

Ref) Oracle 9i Performance Tunning - Volume 1

댓글 없음:

댓글 쓰기