1. enq: TM - contention
DML 이 수행되는 동안, DML 과 관련된 객체에 대한 변경을 방지하기 위해 DML 을 수행하는 프로세스는
반드시 해당 테이블에 대해 TM 락을 획득해야 한다.
TM 락을 획득하는 과정에서 경합이 발생하면 enq: TM - contention 이벤트를 대기하게 된다.
- DML 락 : Data lock, DML 수행시 데이터를 보호하기 위한 락. 로우 락 (TX) 은 특정 로우를 보호하고,
테이블 락 (TM) 은 전체 테이블을 보호한다. DBA_DML_LOCKS 를 통해 관찰 가능하다.
- DDL 락 : Data Dictionary lock. User/Table/View/Procedure 등의 정의를 보호한다.
DBA_DDL_LOCKS 를 통해 관찰가능하다.
- Internal locks and latches
TM Lock 경합이 발생하는 경우
- 인덱스가 없는 Foreign Key 의 부모키를 변경하는 경우
- DML 과 DDL 간의 TM 락 경합
- Lock table .. 에 의한 TM 락 경합
- Direct load 작업에 의한 TM 락 경합
1) 인덱스가 없는 Foreign Key
2) 부적절한 DDL 로 인한 TM 락 경합
3) Lock table.. 을 이용해 의도적으로 TM 락을 획득하는 경우
4) Direct/Parallel Load 작업을 수행한 경우
2. enq : TX - row lock contention,
enq : TX - allocate ITL Entry,
enq : TX - index contention
1) 여러 세션이 동일 로우를 변경하는 경우
(enq: TX - row lock conention, mode=6)
2) 여러 세션이 Unique Key 충돌을 일으키는 경우
(enq: TX - row lock contention, mode=4)
3) ITL 엔트리 부족 (enq: TX-allocate ITL entry, mode=4)
4) 여러 세션이 비트맵 인덱스 (Bitmap Index) 충돌을 일으키는 경우
(enq: TX - row lock contention, mode=4)
5) 인덱스 리프 노드에서 Split 이 발생하는 경우
(enq: TX- index contention, mode=4)
6) 기타 (enq: TX-contention)
3. enq: UL - contention, PL/SQL lock Timer
DBMS_LOCK 패키지를 사용하면 사용자가 임의의 가상적인 자원에 대해 락을 걸 수 있다.
DML 에 의해 발생하는 락의 경우 반드시 물리적인 자원 (테이블/트랜잭션/세그먼트 등) 을 필요로 하지만,
DBMS_LOCK 패키지를 사용할 경우에는 이런 제한이 없다.
DBMS_LOCK 패키지를 이요해 획득하는 락을 UL (User-defined Lock) 락이라고 부른다.
UL 락을 획득하기 위해 대기하는 세션은 enq: UL - contention 이벤트를 대기한다.