5._오라클_Lock
2012.03.25 23:58
오라클 Lock~!!
0. 오라클의 다양한 lock
- 래치 : SGA에 공유돼 있는 갖가지 자료구조를 보호할 목적으로 사용하는 가벼운 Lock
- 버퍼 Lock : 버퍼 블록에 대한 엑세스를 직렬화
- 라이브러리 캐시 Lock : 라이브러리 캐시 오브젝트에 대한 핸들을 보호
- 라이브러리 캐시 Pin : 라이브러리 캐시 오브젝트의 실제 내용이 담긴 힙을 보호
- DML 테이블 Lock : Enqueue Lock으로 구현함
- DML 로우 Lock : 로우 단위 Lock과 트랜잭션 Lock을 조합해서 구현함
※ 어플리케이션 개발 측면에서 가장 중요한 것은 DML Lock이다!!
DML Lock을 이해하기 위해
Enqueue Lock 구조와 트랜잭션 Lock 개념을 이해하는 것이 중요하다.
1. Enqueue Lock
- 공유 리소스에 대한 엑세스를 관리하는 Lock 메커니즘
- Enqueue Lock은 이름 그대로 큐를 사용하기 때문에 대기자 큐에 가장 먼저 Lock 요청을 등록한 세션이 가장 먼저 Lock을 획득함
- Enqueue 리소스 : 소유자, 대기자 목록을 관리할 수 있는 구조체
각 Enqueue 리소스에는 <Type-ID1-ID2>의 식별자가 부여된다.
Type : TX, TM 등
ID1,2 : Lock 종류에 따른 정보
ex) TM lock 식별자
Type : TM
ID1 : 오브젝트 ID
ID2 : 0
ex) TX lock 식별자
Type : TX
ID1 : Undo세그먼트 번호 + 트랜잭션 슬롯번호
ID2 : 트랜잭션 슬롯 Sequence 번호
- 리소스 테이블 : Enqueue 리소스 구조체를 통합 관리
각 리소스를 찾을 때 해싱 알고리즘 사용(해시 키: 식별자)
각 해시 버킷에는 연결리스트로 해시 체인 소유
그림2-4 : 리소스 구조체와 해시 버킷
- Enqueue 방식으로 관리되는 특정 리소스에 대해 Lock을 획득하려면?
(1) 리소스 테이블에서 해당 리소스 구조체를 찾는다.
(2) 찾지 못한다면, 새로운 리소스 구조체를 받아 해시 체인 연결 리스트에 연결
(3) 리소스 구조체의 소유자 목록에 자신을 등록
※ 호환되지 않는 모드로 먼저 Lock을 획득한 세션이 있다면?
Lock요청을 대기자 목록에 등록하여 대기하거나, 작업을 포기하는 선택 가능
- Enqueue Lock의 작동 매커니즘
(1) A세션이 Shared mode로 Lock 획득
(2) B세션이 Shared mode로 Lock을 획득하고자 한다!!!!!
이때, A세션과 호환되므로 정상적으로 Lock을 획득한다 (소유자 목록에 두개의 세션이 저장됨)
(3) C세션이 Exclusive mode로 Lock을 획득하고자 한다!!!!!!
이때 Shared mode와 Exclusive mode간의 호환성이 없으므로 대기자 목록에 자신을 등록, 대기한다.
A,B세션이 모두 Lock을 해제하면 그제서야 C가 Exclusive mode로 소유자 목록에 등록된다.
(4) 다시 A세션이 Exclusive mode로 Lock을 획득하고자 한다면?
역시, 호환되지 않기에 대기자 목록에 자신을 등록하고 대기한다.
(5) B세션이 Shared mode로 Lock 요청을 한다해도 마찬가지~
(6) Exclusive mode는 순서가 보장되므로 C세션이 Lock을 풀면 A세션이 가장 먼저 Lock을 획득한다.
2. TX Lock (트랜잭션 Lock)
- 변경 중인 레코드를 동시에 변경하려는 트랜잭션에 대해서는 엑세스를 직렬화한다.
- 트랜잭션이 첫번째 변경을 시작할때 획득하며, 커밋 또는 롤백 시에 해제한다.
- Enqueue Lock으로 구현되어 있으며 그 원리는 앞에 설명한 것과 동일하다.
그림 2-5 : TX Lock 매커니즘
(1) TX1은 Undo 세그먼트에서 트랜잭션 슬롯을 할당 받고 Enqueue 리소스를 통해 TX Lock을 설정한다.
이 상태에서 r1~5 까지의 레코드를 변경하고 커밋하지 않았다.
(2) TX2는 마찬가지로 트랜잭션 슬롯을 할당받고 Enqueue 리소스를 통해 TX Lock 설정 후 r6 레코드를 변경한다.
(3) TX2가 r3 레코드를 엑세스하는 순간 !!!!!!!
호환되지 않는 모드로 Lock이 걸려있음을 알게되고 TX1의 트랜잭션 슬롯 상태를 확인한다.
(4) TX1는 아직 커밋되지 않은 Active 상태이므로 TX2는 TX1이 Lock을 설정한 Enqueue 리소스 대기자 목록에 자신을 등록
그렇게 대기하면서 3초마다 TX Lock 상태를 확인한다. (교착상태 여부 확인차원에서)
(5) TX1이 커밋하거나 롤백했을때 !!!!!!
TX2는 부활하여 r3 레코드를 변경할 수 있다.
V$LOCK 조회 화면
위 화면에서 알수 있는 사항은 아래와 같다.
- block=1 : 150번이 145번의 진행을 블로킹하고 있다
- lmode=6 : 150번이 Exclusive mode로 TX lock 획득
- request=6 : 145번이 Exclusive mode로 요청한 채 대기..
- 현재 경합이 발생한 TX Lock 실별자는 TX-655401-1601
V$SESSION_WAIT 조회 화면
- TX Lock의 우너인을 파악하려면 V$SESSION_WAIT 또는 이벤트 트레이스를 통해
대기 이벤트 발생 현황을 관찰해야 한다.
TX Lock 구분 표
3. TX Lock : 무결성 제약 위배 가능성 또는 비트맵 인덱스 엔트리 갱신
- DML 로우 경합은 일반적으로 update나 delete 시에만 발생한다. 대부분 insert시에는 발생하지 않으나~~
- 테이블에 Unique 인덱스가 정의되어 있을 때 !!!! insert에 의한 로우 Lock 경합이 발생할 수 있다.
- dept 테이블 deptno 컬럼에 PK인덱스가 생성돼 있는 상황
(1) TX1이 deptno=40 레코드 입력
(2) TX2도 deptno=40 레코드를 입력하면 !!!!
TX1이 커밋 또는 롤백할때까지 Shared mode로 enq: TX-row lock connection 대기 이벤트 발생 !!
(3) TX1이 커밋하면? TX2는 ORA-00001 발생 "ORA-0001: 무결성 제약 조건(PK_DEPT)에 위배됩니다."
(4) TX1이 롤백하면? TX2는 정상적으로 입력
- deptno가 FK인 경우도 마찬가지로 enq: TX-row lock connection 대기 이벤트 발생 !!
다만, TX1이 커밋할 경우 ORA-02991이 발생한다.는 점이 다르다.
- 비트맵 인덱스 엔트리에 대한 갱신을 수행할 때도 Shared mode로 enq: TX-row lock connection 발생 가능
비트맵 인덱스는 하나의 엔트리가 여러 개의 레코드와 매핑되므로 하나의 엔트리에 Lock을 설정하면 매핑되는
레코드 전체에 Lock이 설정되므로 비트맵 인덱스 엔트리를 두 개 이상 TX가 동시에 갱신할때 발생한다.
4. TX Lock : ITL 슬롯 부족
- enq: TX-allocate ITL entry
블록에 레코드를 추가/갱신/삭제하기위해 ITL 슬롯을 먼저 할당받아야 하나,
비어있는 ITL 슬록이 없다면 사용중인 TX 중 하나가 커밋 또는 롤백되길 기다려야 한다.
- 한 블록을 동시에 갱신할 수 있는 개수 -> ITL슬롯에 의해 결정된다.(ITL슬롯 당 24바이트 공간 차지)
- INITRANS : 블록에 기본적으로 할당할 ITL 슬록 개수
- MAXTRANS : 미리 할당된 ITL 슬롯이 모두 사용 중일때, 새로운 TX가 ITL 슬롯을 요청하면
PCTFREE 설정에 의해 비워둔 공간 활용하여 MAXTRANS 값만큼 생성한다.
- ITL 슬롯 부족에 의한 대기 현상 발생?
(1) 동시에 블록을 갱신하려는 TX개수가 MAXTRANS 초과
(2) PCTFREE가 0 이거나 모두 사용한 상태
- INSERT -> 테이블 : 9i부터 ITL슬롯이 부족해도 새 블록을 할당해 쓰기 때문에 ITL 경합 없음
인덱스 : 정렬 상태를 유지해야 하므로 ITL 경합 발생
UPDATE, DELETE는 테이블, 인덱스 모두 발생
※ ITL 경합에 의한 대기 현상이 자주 발생하는 세그먼트에 대해서 INITRANS를 늘려주어야 하며
그 대상 목록은 V$SEGSTAT로 확인할 수 있다.
또한 INITRANS 값을 변경했다해도 기존에 할당된 블록에는 영향이 없고 새로 할당되는 블록에만 영향을 준다.
그러므로 기존 블록에서 많이 발생한다면 재생성을 해줘야 한다.
5. TX LOCK : 인덱스 분할
- 인덱스는 정렬된 상태를 유지해야 하므로 값을 입력할 위치에 빈 공간이 없으면 인덱스 분할을 실시해
새 값을 입력할 공간을 확보하게 되며 이 과정에서 LOCK이 발생할 수 있다.
- 인덱스 분할이 진행되는 동안 그 블록에 새로운 값이 입력하려는 또 다른 TX가 발생했을때 !!!!
그렇다면 두번 째 TX는 선행 TX이 인덱스 분할이 완료할때까지 대기해야 하며
SHARED MODE에서 enq: TX-index connection 이벤트가 발생하게 된다.
- 만약, 인덱스 분할을 진행한 TX가 커밋하지 않은 상태로 계속 연이어 다른 갱신 작업을 한다면??
(1) TX1인 인덱스에 로우를 삽입하는 순간 빈공간을 찾지 못해 인덱스 분할이 필요하다.
(2) TX1는 AUTONOMOUS TX2를 생성해 인덱스 분할을 진행시킨다.
(3) 그 와중에 TX3이 해당 블록에 로우 삽입 시도~!!
enq: TX-index connection 를 맞이하게 되고 TX2가 커밋될때까지 대기한다.
(4) AUTONOMOUS TX인 TX2가 커밋되고 TX1는 자신은 커밋되지 않은 채로 계속 진행가능하다.
(5) TX3도 진행된다.
- PCTFREE
(1) TABLE에서는 나중에 발생할 UPDATE를 위해 남겨두는 공간
(2) INDEX에서는 INSERT를 위해 남겨두는 공간
PCTFREE를 증가시켜 인덱스 분할을 최소화하는 방안은 일시적으로 주기적으로 재생성하는 것이 대안이다.
6. TX LOCK : 읽기 전용 TABLESPACE 전환 시 LOCK
- DML을 수행하는 TX가 남아있는 상태에서 해당 테이블스페이스를 READ ONLY로 변경하면 TX LOCK이 발생한다.
7. TX LOCK : DML 로우 LOCK
- 다중 사용자에 의해 동시에 엑세스되는 사용자 데이터의 무결성을 보호
- 두개의 동시 TX이 같은 로우를 변경하는 것을 방지
- 로우 LOCK = 로우 단위 LOCK + TX LOCK
(1) 로우 갱신을 위해 UNDO 세그먼트에서 TX SLOT을 먼저 할당받고 ENQUEUE 리소스를 통해 TX LOCK을 획득한다.
(2) 그 후 갱신하는 로우마다 EXCLUSIVE MODE로 로우 단위 LOCK을 획득한다.
(TX LOCK은 TX시작할때 한번만 획득)
- 로우 단위 LOCK + 다중 버전 읽기 일관성 매커니즘을 이용하여 읽기 작업에 대해서는 LOCK에 의한 대기 현상이 발생하지 않도록
구현되었다.
(1) 로우 단위 LOCK : 블록 헤어 ITL과 로우 헤더 LOCK BYTE 설정
이를 통해 로우를 갱신 중인 TX살태를 확인하고 엑세스 가능 여부를 결정한다.
(2) TX LOCK : ENQUEUE 리소르를 통해 TX LOCK 설정
LOCK이 설정된 레코드를 갱신하고자 할때 ENQUEUE 리소스에서 대기함
- DML 로우 LOCK에 의한 TX LOCK 대문에 블로킹 된 세션은
EXCLUSIVE MODE에서 enq: TX - row lock connection 대기 이벤트가 계속 발생한다.
8. TM LOCK : DML 테이블 LOCK
- 로우 LOCK 획득 시 해당 테이블에 대한 테이블 LOCK도 동시에 획득
- 테이블 LOCK의 종류는 아래와 같다.
테이블LOCK 종류와 호환성
- 로우 LOCK을 설정하려면 테이블에 RX(=SX) MODE TABLE LOCK을 먼저 획득해야한다.
- SELECT FOR UPDATE -> RS=(SS)
- RS, RX 간에는 어떤 조합으로든 호환이 되므로 위 두가지 상황에서 경합이 발생하지 않으나
같은 로우를 갱신할때는 로우 LOCK에 의한 경합이 발생한다.
- TABLE LOCK은 LOCK을 획득한 선행 TX이 해당 테이블에서 현재 어떤 작업을 수행 중인지 알리는 푯말이라고 보면 된다.
EX) DDL로 테이블의 구조를 변경하고자 할때 !!!
-> TM LOCK여부 확인
-> TX중에서 TM LOCK을 ROW EXCLUSIVE(=SX) MODE로 설정한 TX가 있다??? 현재 테이블 갱신 중..
-> ORA-00054 뿌리고 작업 중단
- TABLE LOCK은 DML 간 동시성을 제어할 때도 사용된다.
( 병렬 DML 또는 DIRECT PATH INSERT 방식으로 작업이 수행될때)
(1) TX1에서 APPEND MODE로 INSERT 수행
-> TX LOCK + TM LOCK 동시 획득, APPEND MODE여서
TM LOCK이 ROW EXCLUSIVE MODE가 아니라 EXCLUSIVE MODE가 되었다.
(2) TX2에서 UPDATE 수행 -> TM LOCK이 ROW EXCLUSIVE MODE로 획득
(3) ROW EXCLUSIVE MODE와 EXCLUSIVE MODE는 호환성이 없으므로 TX2는 BLOCK된다.
로우 LOCK의 호환성을 확인하기 전에 먼저 TABLE LOCK 호환성을 확인하게 된다!!
(4) TX1이 커밋되면 TX2가 UPDATE를 수행할텐데 이 상황에서 TX3이 같은 레코드를 변경하고자 한다면
이번에는 로우 LOCK에 의해서 BLOCK이 발생하게 되는 것이다.
- TX LOCK은 TX마다 오직 한개 씩 획득하나, TM LOCK은 TX에 의해 변경이 가해진 오브젝트 수 만큼 획득한다.
톰 카이트의 예시
9. LOCK을 푸는 열쇠, 커밋
- 블로킹 : LOCK 경합이 발생해 특정 세션이 작업을 진행하지 못하고 멈춰선 경우 -> 해소 방법 : 커밋 또는 롤백
- 교착상태 : 두 세션이 각각 LOCK을 설정한 리소스를 서로 엑세스하려고 마주보고 진행하는 상황
둘 중 하나다 물러나야 진행이 가능하다.
- 교착상태에서 블로킹 상태로??
교착상태가 발생하면 이를 먼저 인지한 세션이 문장 수준 롤백을 진행하고 에러 메세지를 던진다.
(교착상태를 발생시킨 문장 하나만 롤백)
ORA-00060 : deadlock detected while waiting for resource
그리고는 블로킹 상태로 빠지게 되어 커밋할지 롤백할지 결정해야만 하며
프로그램 내에서 예외처리가 안되어 있으면 대기 상태를 지속하게 된다.
- TX가 너무 길다면?
롤백 시 너무 많은 시간이 소요되며 UNDO 세그먼트가 고갈되거나 UNDO 세그먼트 경합이 유발될 수 있다.
- TX가 너무 짧다면?(커밋을 너무 자주하면)
snapshot too old~ 가 발생할 가능성이 높아지고 LGWR가 로그 버퍼를 비우는 동안 발생하는 LOG FILE SYNC 대기 이벤트로
성능 저하 현상이 발생할 수 있다.
- 비동기식 커밋 기능
(1) WAIT : LGWR가 로그버퍼를 파일에 기록했다는 완료 메세지를 받을 때까지 대기, 그동안 LOG FILE SYNC 발생
(2) NOWAIT : LGWR의 완료메세지를 안 기다리고 바로 다음 TX 진행. LOG FILE SYNC 발생하지 않는다.
(3) IMMEDIATE : 커밋할때마다 LGWR가 로그버퍼를 파일에 기록
(4) BATCH : 세션 내부에 TX 데이터를 일정량 버퍼링했다가 일괄 처리. (PGA영역사용 추정)
※ 비동기식 커밋 옵션 사용할 경우
TX 커밋 직후 인스턴스에 문제가 생기거나 REDO LOG가 위치한 파일 시스템에 문제가 생겨
쓰기 작업을 진행할 수 없게 되면 문제가 커진다..ㅠㅠ..
감사합니다.
실습예제
##############################################################################################################################
==>TX1 (SID 521)
오후 10:11:55 SQL> create unique index locu.ix_emp_pk
on locu.emp(JDOID) tablespace tbs_index_s01;
==>TX2 (SID 475)
오후 10:13:19 SQL> update locu.emp
2 set createduser = 'KKS'
3 where jdoid = 1005000001
4 ;
==> Index 생성 중
SID TYPE ID1 ID2 LMODE REQUEST BLOCK USN SLOT SQN
---------- ---- ---------- ---------- ---------- ---------- ---------- --------------- ---------- ----------
521 TX 131091 232258 6 0 0 2 19 232258
521 TM 262292 0 4 0 1 EMP.
521 TM 18 0 3 0 0 OBJ$.
475 TM 262292 0 0 3 0 EMP.
TYPE SID SEQ# EVENT STATE SECONDS_IN_WAIT P1 P2 P3
---- ---------- ---------- -------------------------- ------------------- --------------- ---------- ---------- ----------
TX 521 11188 db file scattered read WAITED KNOWN TIME 1 17 450569 71
TM 521 11188 db file scattered read WAITED KNOWN TIME 1 17 450569 71
TM 475 174 enq: TM - contention WAITING 5 1414332419 262292 0
==> Index 생성 완료후
오후 10:17:08 SQL>
SID TYPE ID1 ID2 LMODE REQUEST BLOCK USN SLOT SQN
---------- ---- ---------- ---------- ---------- ---------- ---------- ------ ---------- ----------
475 TX 65536 221728 6 0 0 1 0 221728
475 TM 262292 0 3 0 0 EMP.
TYPE SID SEQ# EVENT STATE SECONDS_IN_WAIT P1 P2 P3
---- ---------- ---------- ---------------------------- ------------------- --------------- ---------- ---------- ----------
TM 475 193 SQL*Net message from client WAITING 88 1413697536 1 0
TX 475 193 SQL*Net message from client WAITING 88 1413697536 1 0
==>TX1 (SID 521)
오후 10:19:51 SQL> update locu.emp set CREATEDDATE = sysdate where jdoid = 1005000001;
오후 10:20:06 SQL>
SID TYPE ID1 ID2 LMODE REQUEST BLOCK USN SLOT SQN
---------- ---- ---------- ---------- ---------- ---------- ---------- --------- ---------- ----------
521 TX 65536 221728 0 6 0 1 0 221728
475 TX 65536 221728 6 0 1 1 0 221728
475 TM 262292 0 3 0 0 EMP.
521 TM 262292 0 3 0 0 EMP.
TYPE SID SEQ# EVENT STATE SECONDS_IN_WAIT P1 P2 P3
---- ---------- ---------- ------------------------------ ------------------- --------------- ---------- ---------- ----------
TX 475 447 SQL*Net message from client WAITING 55 1413697536 1 0
TM 475 447 SQL*Net message from client WAITING 55 1413697536 1 0
TM 521 26522 enq: TX - row lock contention WAITING 16 1415053318 65536 221728
TX 521 26522 enq: TX - row lock contention WAITING 16 1415053318 65536 221728
==>TX2 (SID 475)
오후 10:21:21 SQL> commit;
오후 10:21:36 SQL>
SID TYPE ID1 ID2 LMODE REQUEST BLOCK USN SLOT SQN
---------- ---- ---------- ---------- ---------- ---------- ---------- ----------- ---------- ----------
521 TX 655378 212722 6 0 0 10 18 212722
521 TM 262292 0 3 0 0 EMP.
TYPE SID SEQ# EVENT STATE SECONDS_IN_WAIT P1 P2 P3
---- ---------- ---------- ----------------------------- ------------------- --------------- ---------- ---------- ----------
TX 521 26524 SQL*Net message from client WAITING 13 1413697536 1 0
TM 521 26524 SQL*Net message from client WAITING 13 1413697536 1 0
==>TX1 (SID 521)
오후 10:21:52 SQL> commit;
오후 10:22:02 SQL>
SID TYPE ID1 ID2 LMODE REQUEST BLOCK USN SLOT SQN
---------- ---- ---------- ---------- ---------- ---------- ---------- ------- ---------- ----------
TYPE SID SEQ# EVENT STATE SECONDS_IN_WAIT P1 P2 P3
---- ---------- ---------- -------------------------- ------------------- --------------- ---------- ---------- ----------
==>TX1 (SID 521)
오후 10:27:20 SQL> create unique index locu.ix_dept_pk on locu.dept(deptno);
Index created
오후 10:27:32 SQL> insert into locu.dept values(1,'부서1');
1 row inserted
오후 10:27:35 SQL>
==>TX2 (SID 475)
오후 10:27:42 SQL> insert into locu.dept values(1,'부서1');
오후 10:28:29 SQL>
SID TYPE ID1 ID2 LMODE REQUEST BLOCK USN SLOT SQN
---------- ---- ---------- ---------- ---------- ---------- ---------- ----------- ---------- ----------
475 TX 393252 231246 0 4 0 6 36 231246
521 TX 393252 231246 6 0 1 6 36 231246
475 TX 458763 211631 6 0 0 7 11 211631
521 TM 262294 0 3 0 0 DEPT.
475 TM 262294 0 3 0 0 DEPT.
TYPE SID SEQ# EVENT STATE SECONDS_IN_WAIT P1 P2 P3
---- ---------- ---------- -------------------------------- ------------------- --------------- ---------- ---------- ----------
TX 521 26607 SQL*Net message from client WAITING 54 1413697536 1 0
TX 475 486 enq: TX - row lock contention WAITING 48 1415053316 393252 231246
TM 475 486 enq: TX - row lock contention WAITING 48 1415053316 393252 231246
TM 521 26607 SQL*Net message from client WAITING 54 1413697536 1 0
==>TX1 (SID 521)
오후 10:28:42 SQL> commit;
Commit complete
==>TX1 (SID 521)
오후 10:32:24 SQL> alter table LOCU.DEPT move tablespace TBS_DATA_S01 initrans 1 maxtrans 2 pctfree 0;
Table altered
오후 10:32:25 SQL> alter index locu.ix_dept_pk rebuild;
Index altered
SQL> insert into locu.dept
2 select no,'부서' || no from (select rownum + 1 no from dual connect by level < 1000)
3 ;
오후 10:43:46 SQL> update locu.dept set name = '부서1' where deptno = 1;
1 row updated
==>TX2 (SID 475)
오후 10:43:52 SQL> update locu.dept set name = '부서2' where deptno = 2;
1 row updated
==> TX3
SQL> update locu.dept set name = '부서3' where deptno = 3;
1 row updated
==> TX4
SQL>
SQL> update locu.dept set name = '부서4' where deptno = 4;
오후 10:40:26 SQL>
SID TYPE ID1 ID2 LMODE REQUEST BLOCK USN SLOT SQN
---------- ---- ---------- ---------- ---------- ---------- ---------- ------------- ---------- ----------
511 TX 655389 211771 0 4 0 10 29 211771
475 TX 65579 220920 6 0 0 1 43 220920
521 TX 131109 231253 6 0 0 2 37 231253
471 TX 655389 211771 6 0 1 10 29 211771
521 TM 262294 0 3 0 0 DEPT.
475 TM 262294 0 3 0 0 DEPT.
471 TM 262294 0 3 0 0 DEPT.
511 TM 262294 0 3 0 0 DEPT.
8 rows selected
TYPE SID SEQ# EVENT STATE SECONDS_IN_WAIT P1 P2 P3
---- ---------- ---------- ----------------------------- ------------------- --------------- ---------- ---------- ----------
TX 475 548 SQL*Net message from client WAITING 15 1413697536 1 0
TX 521 26725 SQL*Net message from client WAITING 21 1413697536 1 0
TM 471 66 SQL*Net message from client WAITING 9 1413697536 1 0
TM 475 548 SQL*Net message from client WAITING 15 1413697536 1 0
TM 521 26725 SQL*Net message from client WAITING 21 1413697536 1 0
TX 511 103 enq: TX - allocate ITL entry WAITING 3 1415053316 655389 211771
TM 511 103 enq: TX - allocate ITL entry WAITING 3 1415053316 655389 211771
TX 471 66 SQL*Net message from client WAITING 9 1413697536 1 0
8 rows selected
==>TX1 (SID 521)
오후 10:46:22 SQL> commit;
Commit complete
오후 10:46:24 SQL>
==>TX2 (SID 475)
오후 10:46:55 SQL> commit;
Commit complete
SID TYPE ID1 ID2 LMODE REQUEST BLOCK USN SLOT SQN
---------- ---- ---------- ---------- ---------- ---------- ---------- ----------- ---------- ----------
511 TX 196632 232708 6 0 0 3 24 232708
471 TX 655389 211771 6 0 0 10 29 211771
471 TM 262294 0 3 0 0 DEPT.
511 TM 262294 0 3 0 0 DEPT.
TYPE SID SEQ# EVENT STATE SECONDS_IN_WAIT P1 P2 P3
---- ---------- ---------- ----------------------------- ------------------- --------------- ---------- ---------- ----------
TX 511 106 SQL*Net message from client WAITING 14 1413697536 1 0
TM 511 106 SQL*Net message from client WAITING 14 1413697536 1 0
TM 471 66 SQL*Net message from client WAITING 195 1413697536 1 0
TX 471 66 SQL*Net message from client WAITING 195 1413697536 1 0
==>TX1 (SID 521)
오후 11:12:35 SQL> select * from locu.dept where deptno = 118032 for update;
DEPTNO NAME
---------- ------------------------------
118032 부서18032
오후 11:12:36 SQL>
==>TX2 (SID 475)
오후 11:12:43 SQL> update locu.dept set name = '부서3' where deptno = 118032;
오후 11:12:45 SQL>
SID TYPE ID1 ID2 LMODE REQUEST BLOCK USN SLOT SQN
---------- ---- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
475 TX 196653 232472 0 6 0 3 45 232472
475 TM 262294 0 3 0 0 DEPT.
521 TM 262294 0 3 0 0 DEPT.
521 TX 196653 232472 6 0 1 3 45 232472
SID SEQ# EVENT STATE SECONDS_IN_WAIT P1 P2 P3
---------- ---------- -------------------------------- ------------------- --------------- ---------- ---------- ----------
475 706 enq: TX - row lock contention WAITING 3 1415053318 196653 232472
521 27052 SQL*Net message from client WAITING 12 1413697536 1 0
==>TX1 (SID 521)
오후 11:13:22 SQL> rollback;
Rollback complete
==>TX2 (SID 475)
1 row updated
오후 11:13:24 SQL>
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
26 | 3._SQL트레이스 | sapius | 2012.04.03 | 37297 |
25 | 8._Statspack_AWR | 시와처 | 2012.04.01 | 11767 |
24 |
7._Response_Time_Analysis_방법론과_OWI
![]() | 시와처 | 2012.04.01 | 5916 |
23 | 6._V$SYSTEM_EVENT | 시와처 | 2012.04.01 | 3507 |
22 | 4._동시성_구현_사례 [1] | dasini | 2012.03.26 | 11962 |
» |
5._오라클_Lock
![]() | 시와처 | 2012.03.25 | 12875 |
20 | 3._비관적_vs._낙관적_동시성_제어 | dasini | 2012.03.25 | 6396 |
19 | 2._AutoTrace | 남송휘 | 2012.03.25 | 3138 |
18 | 1._Explain_Plan | 남송휘 | 2012.03.25 | 4543 |
17 | 3장._오라클_성능_관리 | 남송휘 | 2012.03.25 | 3117 |
16 |
2._트랜잭션_수준_읽기_일관성
![]() | AskZZang | 2012.03.20 | 6364 |
15 | 1._트랜잭션_동시성_제어 | AskZZang | 2012.03.19 | 4883 |
14 | 11._Shared_Pool | 박영창 | 2012.03.19 | 3395 |
13 | 10._대기_이벤트 | 박영창 | 2012.03.18 | 10624 |
12 | 9._Snapshot_too_old | 박영창 | 2012.03.18 | 9969 |
11 | 8._블록_클린아웃 | 시와처 | 2012.03.18 | 12305 |
10 |
7._Consistent_vs._Current_모드_읽기
![]() | 시와처 | 2012.03.18 | 5708 |
9 | 2장._트랜잭션과_Lock | AskZZang | 2012.03.16 | 5462 |
8 |
6._문장수준_읽기_일관성
![]() | 정찬호 | 2012.03.11 | 57563 |
7 |
4._Redo
![]() | 남송휘 | 2012.03.11 | 5606 |