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 |
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
댓글 없음:
댓글 쓰기