문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 다음 판 양쪽 다음 판 | ||
study:oracle:adv_owi_10g:transaction_wait_event [2009/08/11 13:09] starlits |
study:oracle:adv_owi_10g:transaction_wait_event [2009/08/17 08:56] starlits |
||
---|---|---|---|
줄 3: | 줄 3: | ||
===== 트랜잭션 작업순서 ===== | ===== 트랜잭션 작업순서 ===== | ||
- | * 사용자 DML(트랜잭션)수행 작업순서 | + | == 사용자 DML(트랜잭션)수행 작업순서 |
^ 순서 ^ 작업내용 ^ 실패시 동작 ^ 이벤트 ^ | ^ 순서 ^ 작업내용 ^ 실패시 동작 ^ 이벤트 ^ | ||
줄 78: | 줄 78: | ||
- TX락은 트랜잭션을 보호하는 것이므로, | - TX락은 트랜잭션을 보호하는 것이므로, | ||
+ | - 여기서는 3가지 종류를 이야기 한다. | ||
+ | - enq:TX - row lock contention | ||
+ | - enq:TX - allocate ITL Entry | ||
+ | - enq:TX - index contention | ||
+ | |||
+ | === === | ||
+ | |||
+ | ^ 여러 세션이 동일 로우를 변경하는 경우 | ||
+ | ^ 여러 세센이 Unique Key 충돌을 일으키는 경우 | ||
+ | ^ ITL Entry 부족 | ||
+ | ^ 여러 세션이 Bitmap Index 충돌을 일어키는 경우 | ||
+ | ^ 인덱스 리프 노드에서 Split이 발생하는 경우 | ||
+ | ^ 기타 | ||
+ | |||
==== 여러 세션이 동일 로우를 변경하는 경우 ==== | ==== 여러 세션이 동일 로우를 변경하는 경우 ==== | ||
- | - | + | - 동일 row 변경은 TX 락 경합이 발생하는 가장 보편적인 경우이다. |
+ | - row level lock 구성 : **[로우 자체의 변경사실 + ITL + 트랜잭션 테이블 슬롯 + TX락]** | ||
+ | - **enq:TX - row lock contention 이벤트** | ||
+ | * 프로세스가 특정 로우를 변경하기 위해 해당 로우를 방문했을 때, \\ 현재 로우가 변경된 상태라면 ITL로부터 해당 로우를 변경한 트랙잭션을 확인하고 \\ 자기 자신을 TX Enqueue 목록에 추가하고 대기하는 이벤트 | ||
==== 여러 세센이 Unique Key 충돌을 일으키는 경우 ==== | ==== 여러 세센이 Unique Key 충돌을 일으키는 경우 ==== | ||
+ | |||
+ | - Unique Key, Primary Key 충돌시에도 TX 락 경합이 발생한다. | ||
+ | - **enq:TX - row lock contention** | ||
+ | - 프로세스 A가 Insert를 수행한 후, \\ 프로세스 B가 Unique Key 충돌이 발생하게끔 insert를 수행하면 \\ **프로세스 B는 프로세스 A의 트랜잭션에 대해 TX 락을 Shared Mode로 획득하기 위해서 대기**한다. | ||
+ | - 프로세스 B는 프로세스 A가 commit 또는 rollback 할때까지 대기한다. | ||
+ | - 프로세스 A가 **commit** 이 이루어지면 **ORA-0001 에러** 상황이 되며, \\ **rollback** 이 이루어지면 프로세스 B의 **Insert는 성공적으로** 이루어지게 된다. | ||
+ | |||
==== ITL Entry 부족 ==== | ==== ITL Entry 부족 ==== | ||
- | - | + | - 모든 트랜잭션은 블록을 변경시키기 전에 블록 헤더의 ITL에 엔트리를 등록해야 한다. |
+ | - **enq:TX - allocate ITL entry** | ||
+ | - ITL 이 MAXTRANS를 초과하거나 블록 내의 여유공간이 부족해서 엔트리를 등록하는 것이 불가능한 경우, \\ 프로세스는 이미 ITL에 엔트리를 등록한 프레세스의 트랜잭션에 대해 TX 락을 Shared mode로 획득하기 위해 대기하는 이벤트 | ||
+ | - 10g 부터는 MAXTRANS 값이 255로 고정되어 있다. | ||
==== 여러 세션이 Bitmap Index 충돌을 일어키는 경우 ==== | ==== 여러 세션이 Bitmap Index 충돌을 일어키는 경우 ==== | ||
- | - | + | - 하나의 리프 노드가 넓은 범위의 ROWID를 관리한다. |
+ | - **enq:TX - row lock contention** | ||
+ | - 테이블의 로우가 변경될때마다 비트맵 인덱스에 해당하는 컬럼값에 대해 로우가 속한 리프 노드의 비트맵을 매번 새로 계산해주어야 한다. \\ 따라서 동시에 두 세션이 같은 리프 노드의 비트맵 연산을 수행할 경우, 순서를 보장하기 위해서 TX 락을 획득한다. | ||
+ | - 특정 세션이 TX 락을 Exclusive 하게 획득한 후, 비트맵 연산을 수행하고 아직 커밋을 하지 않았다면, | ||
==== 인덱스 리프 노드에서 Split이 발생하는 경우 ==== | ==== 인덱스 리프 노드에서 Split이 발생하는 경우 ==== |