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