5._오라클_Lock

조회 수 10842 추천 수 0 2013.09.06 23:29:01
시와처 *.124.106.147


오라클 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 : 리소스 구조체와 해시 버킷

P20120327_203904000_59420DE7-B8D7-4808-83AF-3142C2DF542F.JPG




- 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 매커니즘

P20120327_203922000_8ABF62F3-8DEB-483C-8481-1CDBF46B5E6D.JPG



     (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 조회 화면

P20120327_203936000_3E44DCDE-186A-4D79-BB03-714278E2A659.JPG


위 화면에서 알수 있는 사항은 아래와 같다.

- block=1 : 150번이 145번의 진행을 블로킹하고 있다

- lmode=6 : 150번이 Exclusive mode로 TX lock 획득

- request=6 : 145번이 Exclusive mode로 요청한 채 대기..

- 현재 경합이 발생한 TX Lock 실별자는 TX-655401-1601




V$SESSION_WAIT 조회 화면

P20120327_203958000_E5744BE0-885A-4D35-AE96-25A58D01F444.JPG


- TX Lock의 우너인을 파악하려면 V$SESSION_WAIT 또는 이벤트 트레이스를 통해

대기 이벤트 발생 현황을 관찰해야 한다.




TX Lock 구분 표


P20120327_204016000_D409B81D-AF1A-4C21-81B2-2B8407ABAC6F.JPG






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 종류와 호환성

P20120327_204057000_C8D2B42B-58B2-476A-9DE4-EBDDCFA9E813.JPG



- 로우 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에 의해 변경이 가해진 오브젝트 수 만큼 획득한다.



톰 카이트의 예시

P20120327_204124000_3DF50D08-B197-4033-857E-6F12493F6413.JPG





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>