深入分析 enq: TX - row lock contention

    [oracle@roger ~]$ sqlplus "/as sysdba"

    SQL*Plus: Release 10.2.0.4.0 - Production on Thu Apr 28 21:27:18 2011

    Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
    Connected to:
    Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options

    SQL> conn roger1/roger1
    Connected.
    SQL> create table nm_tx1 as select * from dba_objects;

    Table created.

    SQL> create table nm_tx2 as select * from dba_objects where object_id <30000;

    Table created.

    SQL> alter table nm_tx1 add constraint pk_nm_tx1 primary key (object_id);

    Table altered.

    SQL> alter table nm_tx2 add constraint pk_nm_tx2 foreign key (object_id)
      2  references nm_tx1 (object_id);

    Table altered.

    SQL>
    SQL> col owner for a15
    SQL> col CONSTRAINT_NAME for a30
    SQL> col TABLE_NAME for a25
    SQL> set lines 150
    SQL> select owner,CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,INDEX_NAME,status from dba_constraints where owner='ROGER1';
      2  and table_name like '%NM%';

    OWNER           CONSTRAINT_NAME                C TABLE_NAME                INDEX_NAME                     STATUS
    --------------- ------------------------------ - ------------------------- ------------------------------ --------
    ROGER1          PK_NM_TX2                      R NM_TX2                                                   ENABLED
    ROGER1          PK_NM_TX1                      P NM_TX1                    PK_NM_TX1                      ENABLED

    SQL>

    ----session 1
    SQL> show user
    USER is "SYS"
    SQL> update roger1.nm_tx1 set owner='SYS' where object_id >10000 and object_id <15000;

    4895 rows updated.

    Elapsed: 00:00:00.12
    SQL>

    ---session 2

    SQL> show user
    USER is "SYS"
    SQL> update roger1.nm_tx1 set owner='SYS' where object_id >10000 and object_id <15000;
    ---一直处于等待状态


    ---session 3

    SQL> conn /as sysdba
    Connected.
    SQL> set lines 150
    SQL> col event for a60
    SQL> select event,count(*) from v$session where wait_class# <>6 group by event;

    EVENT                                                          COUNT(*)
    ------------------------------------------------------------ ----------
    enq: TX - row lock contention                                         1   ---出现了该event
    SQL*Net message to client                                             1

    Elapsed: 00:00:00.03
    SQL>

    ----session 4

    SQL> show user
    USER is "SYS"
    SQL> delete from roger1.nm_tx2  where object_id >1000 and object_id <1500;

    3992 rows deleted.

    Elapsed: 00:00:00.15
    SQL>    --不提交

    ----session 5
    SQL> show user
    USER is "ROGER1"
    SQL> set timing on
    SQL> delete from nm_tx1 where object_id >1000 and object_id <1500;
    --处于等待状态

    查询event:
      1* select event,count(*) from v$session where wait_class# <>6 group by event
    SQL> /

    EVENT                                                          COUNT(*)
    ------------------------------------------------------------ ----------
    enq: TM - contention                                                  1
    SQL*Net message to client                                             1

    Elapsed: 00:00:00.04
    SQL>


    -------实验2
    SQL> create table tab_a  (id number primary key);

    Table created.

    Elapsed: 00:00:00.39
    SQL> create table tab_b (id number references  tab_a(id) ,name varchar2(4));

    Table created.

    Elapsed: 00:00:00.06
    SQL> insert into tab_a values(100);

    1 row created.

    Elapsed: 00:00:00.01


    Elapsed: 00:00:00.04
    SQL> insert into tab_b values(100,'lizx');   --

    1 row created.

    Elapsed: 00:00:00.01
    SQL> commit;

    Commit complete.

    Elapsed: 00:00:00.05
    SQL> select * from tab_a;

            ID
    ----------
           100

    Elapsed: 00:00:00.08
    SQL> select * from tab_b;

            ID NAME
    ---------- ----
           100 lizx

    Elapsed: 00:00:00.01
    SQL> insert into tab_a values(200);

    1 row created.

    Elapsed: 00:00:00.01
    SQL>
    SQL> conn /as sysdba

    Connected.
    SQL> SQL>
    SQL>
    SQL>
    SQL> set timing on
    SQL> insert into tab_b values(200,'htht');  ---一直等待。。。

    SQL> select event,count(*) from v$session where wait_class# <>6 group by event;

    EVENT                                                          COUNT(*)
    ------------------------------------------------------------ ----------
    enq: TX - row lock contention                                         1
    SQL*Net message to client                                             1

    Elapsed: 00:00:00.23
    SQL>    --此时的等待事件


    SQL> select sess.sid,
      2     sess.serial#,
       lo.oracle_username,
      3    4     lo.os_user_name,
      5     ao.object_name,
      6     lo.locked_mode
      7     from v$locked_object lo,
      8     dba_objects ao,
      9     v$session sess
     10  where ao.object_id = lo.object_id and lo.session_id = sess.sid;

           SID    SERIAL# ORACLE_USERNAME                OS_USER_NAME                   OBJECT_NAME                    LOCKED_MODE
    ---------- ---------- ------------------------------ ------------------------------ ------------------------------ -----------
           137         53 SYS                            oracle                         TAB_A                                    3
           135         11 SYS                            oracle                         TAB_A                                    2
           137         53 SYS                            oracle                         TAB_B                                    2
           135         11 SYS                            oracle                         TAB_B                                    3

    SQL> select s.sid,s.serial#,p.spid from v$process p,v$session s where p.addr=s.paddr and s.sid in(137,135);

           SID    SERIAL# SPID
    ---------- ---------- ------------
           135         11 5377
           137         53 5386

    SQL> select sid,serial#,username,SQL_ID,BLOCKING_SESSION,BLOCKING_SESSION_STATUS from v$session where event='enq: TX - row lock contention';

           SID    SERIAL# USERNAME                       SQL_ID        BLOCKING_SESSION BLOCKING_SE
    ---------- ---------- ------------------------------ ------------- ---------------- -----------
           135         11 SYS                            08p87k41wg761              137 VALID

    SQL> oradebug setospid 5377
    Oracle pid: 21, Unix process pid: 5377, image: (TNS V1-V3)
    SQL> oradebug dump processstate 10
    Statement processed.
    SQL> oradebug tracefile_name
    /oracle/product/admin/roger/udump/roger_ora_5377.trc
    SQL>
    SQL> oradebug setospid 5386
    Oracle pid: 23, Unix process pid: 5386, image: (TNS V1-V3)
    SQL> oradebug dump processstate 10
    Statement processed.
    SQL> oradebug tracefile_name
    /oracle/product/admin/roger/udump/roger_ora_5386.trc
    SQL>

    SQL> select event#,NAME,PARAMETER1,PARAMETER2,PARAMETER3 FROM v$event_name where name='enq: TX - row lock contention';

        EVENT# NAME                                          PARAMETER1                PARAMETER2                PARAMETER3
    ---------- --------------------------------------------- ------------------------- ------------------------- -------------------------
           186 enq: TX - row lock contention                 name|mode                 usn<<16 | slot            sequence

    SQL>

    SQL> select owner,index_name from dba_indexes where table_name='TAB_A';

    OWNER                          INDEX_NAME
    ------------------------------ ------------------------------
    SYS                            SYS_C005268

    SQL> select owner,index_name from dba_indexes where table_name='TAB_B';

    no rows selected

    SQL> select object_id from dba_objects where object_name='SYS_C005268';

     OBJECT_ID
    ----------
         52496

    SQL> select xidusn,xidslot,xidsqn,ubablk,ubafil,ubarec from v$transaction;

        XIDUSN    XIDSLOT     XIDSQN     UBABLK     UBAFIL     UBAREC
    ---------- ---------- ---------- ---------- ---------- ----------
             5          7        424       1653          6         49
             9         26        435       2527          6         54

    SQL> select usn,name from v$rollname where usn in(5,9);

           USN NAME
    ---------- ---------------------------------------------
             5 _SYSSMU5$
             9 _SYSSMU9$

    SQL> select object_id,data_object_id from dba_objects where object_name='SYS_C005268';

     OBJECT_ID DATA_OBJECT_ID
    ---------- --------------
         52496          52496

    SQL> select owner,object_name,object_id,object_type from dba_objects where object_id=52497;

    OWNER                          OBJECT_NAME                     OBJECT_ID OBJECT_TYPE
    ------------------------------ ------------------------------ ---------- -------------------
    SYS                            TAB_B                               52497 TABLE

    SQL>

      SO: 0x2df00c08, type: 4, owner: 0x2de24cec, flag: INIT/-/-/0x00
        (session) sid: 135 trans: 0x2ca16584, creator: 0x2de24cec, flag: (80000041) USR/- BSY/-/-/-/-/-
                  DID: 0001-0015-0000000C, short-term DID: 0000-0000-00000000
                  txn branch: (nil)
                  oct: 2, prv: 0, sql: 0x2d9ff67c, psql: (nil), user: 0/SYS
        service name: SYS$USERS
        O/S info: user: oracle, term: pts/2, ospid: 5376, machine: roger
                  program: (TNS V1-V3)
        application name: (TNS V1-V3), hash value=96210805
        waiting for 'enq: TX - row lock contention'blocking sess=0x0x2df033b8seq=9 wait_time=0 seconds since wait started=57
                    name|mode=54580004, usn<<16 | slot=9001a, sequence=1b3
        Dumping Session Wait History
         for 'enq: TX - row lock contention' count=1 wait_time=2931132
                    name|mode=54580004, usn<<16 | slot=9001a, sequence=1b3
         for 'enq: TX - row lock contention' count=1 wait_time=2931051
                    name|mode=54580004, usn<<16 | slot=9001a, sequence=1b3
         for 'enq: TX - row lock contention' count=1 wait_time=2930298
                    name|mode=54580004, usn<<16 | slot=9001a, sequence=1b3
         for 'enq: TX - row lock contention' count=1 wait_time=2931106
                    name|mode=54580004, usn<<16 | slot=9001a, sequence=1b3
         for 'enq: TX - row lock contention' count=1 wait_time=2931138
                    name|mode=54580004, usn<<16 | slot=9001a, sequence=1b3
         for 'enq: TX - row lock contention' count=1 wait_time=2931233
                    name|mode=54580004, usn<<16 | slot=9001a, sequence=1b3
         for 'enq: TX - row lock contention' count=1 wait_time=2930821
                    name|mode=54580004, usn<<16 | slot=9001a, sequence=1b3
         for 'enq: TX - row lock contention' count=1 wait_time=2930791
                    name|mode=54580004, usn<<16 | slot=9001a, sequence=1b3
         for 'enq: TX - row lock contention' count=1 wait_time=2931111
                    name|mode=54580004, usn<<16 | slot=9001a, sequence=1b3
         for 'enq: TX - row lock contention' count=1 wait_time=2931258
                    name|mode=54580004, usn<<16 | slot=9001a, sequence=1b3
        temporary object counter: 0
       
    从上看,该进程一直在等待enq: TX - row lock contention

          SO: 0x2ca16584, type: 40, owner: 0x2df00c08, flag: INIT/-/-/0x00
          (trans) flg = 0xe03, flg2 = 0x14000, prx = 0x0, ros = 2147483647 bsn = 0x21 bndsn = 0x24 spn = 0x24
          efd = 4
          parent xid: 0x0000.000.00000000
          env: (scn: 0x0000.0018b619  xid: 0x0005.007.000001a8  uba: 0x01800675.01e7.31  statement num=0  parent xid: xid: 0x0000.000.00000000  scn: 0x0000.0018b619 0sch: scn: 0x0000.00000000)
          cev: (spc = 2152  arsp = 2ca5a558  ubk tsn: 7 rdba: 0x01800675  useg tsn: 7 rdba: 0x01800049
                hwm uba: 0x01800675.01e7.31  col uba: 0x00000000.0000.00
                num bl: 1 bk list: 0x2c9e999c)
                cr opc: 0x0 spc: 2152 uba: 0x01800675.01e7.31
          (enqueue) TX-00050007-000001A8 DID: 0001-0015-0000000C
          lv: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  res_flag: 0x6
          res: 0x2d470f5c, mode: X, lock_flag: 0x0
          own: 0x2df00c08, sess: 0x2df00c08, proc: 0x2de24cec, prv: 0x2d470f64
           xga: 0x0, heap: UGA
          Trans IMU st: 2 Pool index 1, Redo pool 0x2cbad520, Undo pool 0x2cbad4e8
          Redo pool range [0x2ca87034 0x2ca871cc 0x2ca96634]
          Undo pool range [0x2cbad800 0x2cbad978 0x2cbbd200]
          Redo small pool range [0x0 0x0 0x0]
          Undo small pool range [0x0 0x0 0x0]
          Pmd 0x2cbac878 opc: 1 bkopc: 0, recstate 0
          txnvalid 1 chgvalid 1 cvsvalid 1
          IMU Redo pool sz 62976, usage 408
          IMU Undo pool sz 64000, usage 376
          IMU changes: 2 applied chgs:  2 Redosiz 336, Flush reason 5
          Redo Private strand index = 2
    Strand index 2 Strand state 1 Available bufs 123
    Current IMU pool 1 First buf 0x2ca86fe0 Strand size 66560
         -------------------------------------------------------
          IMU redo block change list
          ------------------------------------------------------
             tsn 0 rdba 0x40fa3a bh 0x23fee7e8 cv 0x2ca87084
          ------------------------------------------------------
    KTB Redo
    op: 0x01  ver: 0x01 
    op: F  xid:  0x0005.007.000001a8    uba: 0x01800675.01e7.31
    KDO Op code: IRP row dependencies Disabled
      xtype: XA flags: 0x00000000  bdba: 0x0040fa3a  hdba: 0x0040fa39
    itli: 2  ispac: 0  maxfr: 4863
    tabn: 0 slot: 1(0x1) size/delt: 11
    fb: --H-FL-- lb: 0x2  cc: 2
    null: --
    col  0: [ 2]  c2 03
    col  1: [ 4]  68 74 68 74
          ------------------------------------------------------
             tsn 7 rdba 0x1800049 bh 0x27bf8978 cv 0x2ca87150
          ------------------------------------------------------
    ktudh redo: slt: 0x0007 sqn: 0x000001a8 flg: 0x0012 siz: 108 fbi: 1
                uba: 0x01800675.01e7.31    pxid:  0x0000.000.00000000
          ------------------------------------------------------
          ------------------------------------------------------
          IMU Undo change vector list  (latched dump)
          ------------------------------------------------------
             umap:  0x2cbad92c uba: 0x01800675.01e7.31
             undobh 0x227fc5b0 cv 0x2cbad848 rcvi 0 Applied
          ------------------------------------------------------
    ktudb redo: siz: 108 spc: 2262 flg: 0x0012 seq: 0x01e7 rec: 0x31
                xid:  0x0005.007.000001a8 
    ktubl redo: slt: 7 rci: 0 opc: 11.1 objn: 52497 objd: 52497 tsn: 0
    Undo type:  Regular undo        Begin trans    Last buffer split:  No
    Temp Object:  No
    Tablespace Undo:  No
                 0x00000000  prev ctl uba: 0x01800676.01e7.0e
    prev ctl max cmt scn:  0x0000.0018b116  prev tx cmt scn:  0x0000.0018b14d
    txn start scn:  0x0000.00000000  logon user: 0  prev brb: 25167474  prev bcl: 0 KDO undo record:
    KTB Redo
    op: 0x03  ver: 0x01 
    op: Z
    KDO Op code: DRP row dependencies Disabled
      xtype: XA flags: 0x00000000  bdba: 0x0040fa3a  hdba: 0x0040fa39
    itli: 2  ispac: 0  maxfr: 4863
    tabn: 0 slot: 1(0x1)
          ------------------------------------------------------
            ----------------------------------------
            SO: 0x2c9e999c, type: 39, owner: 0x2ca16584, flag: -/-/-/0x00
            (List of Blocks) next index = 1
            index   itli   buffer hint   rdba       savepoint
            -----------------------------------------------------------
                0      2   0x23fee7e8    0x40fa3a     0x23
            ----------------------------------------
            SO: 0x2c9c6754, type: 36, owner: 0x2ca16584, flag: INIT/-/-/0x00
            DML LOCK: tab=52497 flg=11 chi=0
                      his[0]: mod=3 spn=33
            (enqueue) TM-0000CD11-00000000 DID: 0001-0015-0000000C
            lv: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  res_flag: 0x6
            res: 0x2d46bc14, mode: SX, lock_flag: 0x0
            own: 0x2df00c08, sess: 0x2df00c08, proc: 0x2de24cec, prv: 0x2d46bc1c
            ----------------------------------------
            SO: 0x2c9c66a8, type: 36, owner: 0x2ca16584, flag: INIT/-/-/0x00
            DML LOCK: tab=52495 flg=11 chi=0
                      his[0]: mod=2 spn=33
            (enqueue) TM-0000CD0F-00000000 DID: 0001-0015-0000000C
            lv: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  res_flag: 0x6
            res: 0x2d470e54, mode: SS, lock_flag: 0x0
            own: 0x2df00c08, sess: 0x2df00c08, proc: 0x2de24cec, prv: 0x2d470e5c
          ----------------------------------------
          SO: 0x2bb9f6e8, type: 53, owner: 0x2df00c08, flag: INIT/-/-/0x00
          LIBRARY OBJECT LOCK: lock=2bb9f6e8 handle=2a35d0d8 mode=N
          call pin=(nil) session pin=(nil) hpc=0000 hlc=0000
          htl=0x2bb9f734[0x2bb9e738,0x2bb9e738] htb=0x2bb9e738 ssga=0x2bb9e4d4
          user=2df00c08 session=2df00c08 count=0 flags=LRU/[4000] savepoint=0x1e
          LIBRARY OBJECT HANDLE: handle=2a35d0d8 mtx=0x2a35d18c(0) cdp=0
          name=SYS.TAB_B
          hash=186a62ed18bde8071175e9d275758835 timestamp=04-28-2011 22:19:10
          namespace=TABL flags=KGHP/TIM/SML/[02000000]
          kkkk-dddd-llll=0000-0701-0201 lock=N pin=0 latch#=1 hpc=0004 hlc=0004
          lwt=0x2a35d134[0x2a35d134,0x2a35d134] ltm=0x2a35d13c[0x2a35d13c,0x2a35d13c]
          pwt=0x2a35d118[0x2a35d118,0x2a35d118] ptm=0x2a35d120[0x2a35d120,0x2a35d120]
          ref=0x2a35d154[0x2a35d154,0x2a35d154] lnd=0x2a35d160[0x2a288cd0,0x2a36de28]
            LIBRARY OBJECT: object=2885b5dc
            type=TABL flags=EXS/LOC[0005] pflags=[0000] status=VALD load=0
            DATA BLOCKS:
            data#     heap  pointer    status pins change whr
            ----- -------- -------- --------- ---- ------ ---
                0 2a3e0e44 2885b698 I/-/A/-/-    0 NONE   00
                8 2885b868 29b3d4cc I/-/A/-/-    0 NONE   00
               10 2885b8b8 28e86a58 I/-/A/-/-    0 NONE   00
              
              

    堵塞进程的dump信息:          
    ktudh redo: slt: 0x001a sqn: 0x000001b3 flg: 0x0012 siz: 108 fbi: 0
                uba: 0x018009df.01bf.35    pxid:  0x0000.000.00000000
          ------------------------------------------------------
             tsn 0 rdba 0x40fa32 bh 0x227fcad4 cv 0x2ca76db4
          ------------------------------------------------------
    index redo (kdxlin):  insert leaf row
    KTB Redo
    op: 0x01  ver: 0x01 
    op: F  xid:  0x0009.01a.000001b3    uba: 0x018009df.01bf.36
    REDO: SINGLE / -- / --
    itl: 2, sno: 1, row size 13
    insert key: (3):  02 c2 03
    keydata: (6):  00 40 fa 2a 00 01


    ktudb redo: siz: 92 spc: 1168 flg: 0x0022 seq: 0x01bf rec: 0x36
                xid:  0x0009.01a.000001b3 
    ktubu redo: slt: 26 rci: 53 opc: 10.22 objn: 52496 objd: 52496 tsn: 0
    Undo type:  Regular undo       Undo type:  Last buffer split:  No
    Tablespace Undo:  No
                 0x00000000
    index undo for leaf key operations
    KTB Redo
    op: 0x04  ver: 0x01 
    op: L  itl: xid:  0x0009.004.000001b3 uba: 0x018009de.01bf.13
                          flg: C---    lkc:  0     scn: 0x0000.0018b37f
    Dump kdilk : itl=2, kdxlkflg=0x1 sdc=0 indexid=0x40fa31 block=0x0040fa32
    (kdxlpu): purge leaf row
    key :(3):  02 c2 03

            SO: 0x2c9f0b9c, type: 39, owner: 0x2ca39400, flag: -/-/-/0x00
            (List of Blocks) next index = 2
            index   itli   buffer hint   rdba       savepoint
            -----------------------------------------------------------
                0      2   0x23fee960    0x40fa2a     0x23
                1      2   0x227fcad4    0x40fa32     0x26
            ----------------------------------------
            SO: 0x2c9c65fc, type: 36, owner: 0x2ca39400, flag: INIT/-/-/0x00
            DML LOCK: tab=52497 flg=11 chi=0
                      his[0]: mod=2 spn=33
            (enqueue) TM-0000CD11-00000000 DID: 0001-0017-0000000F
            lv: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  res_flag: 0x6
            res: 0x2d46bc14, mode: SS, lock_flag: 0x0
            own: 0x2df033b8, sess: 0x2df033b8, proc: 0x2de25864, prv: 0x2c9c6774
            ----------------------------------------
            SO: 0x2c9c6550, type: 36, owner: 0x2ca39400, flag: INIT/-/-/0x00
            DML LOCK: tab=52495 flg=11 chi=0
                      his[0]: mod=3 spn=33
            (enqueue) TM-0000CD0F-00000000 DID: 0001-0017-0000000F
            lv: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  res_flag: 0x6
            res: 0x2d470e54, mode: SX, lock_flag: 0x0
            own: 0x2df033b8, sess: 0x2df033b8, proc: 0x2de25864, prv: 0x2c9c66c8
     从上面的表色部分基本上就能看出整个enq: TX - row lock contention的原因了。

    下面做个简单的总结,关于index相关的几个event:

        EVENT# NAME                             PARAMETER1     PARAMETER2       PARAMETER3    WAIT_CLASS  
    ---------- -------------------------------- -------------- ---------------- ------------- -------------
           186 enq: TX - row lock contention    name|mode      usn<<16 | slot   sequence      Application
           187 enq: TX - allocate ITL entry     name|mode      usn<<16 | slot   sequence      Configuration
           188 enq: TX - index contention       name|mode      usn<<16 | slot   sequence      Concurrency
           580 enq: TX - contention             name|mode      usn<<16 | slot   sequence      Other

    1.  enq: TX - row lock contention  ,顾名思义,该event是row级别的,要处理该问题,唯一的方式就是调整应用逻辑。

    2.  enq: TX - allocate ITL entry   ,该event明显是index  itl不足(通常是在高并发的情况下),当然最简单的方式就是调大init_trans了。

    3.  enq: TX - index contention   ,该event的出现通常也是在高并发的时候,不过一般是由于index split等导致,处理方式的话,一般手段是将index重建为反向键index或将index进行hash分区。如果是跟sequence相关的话,那建议将sequence cache值调大。

    4. enq: TX - contention    ,该event跟前面3种不一样了,该event属于事务级别。原理跟第一类似,不过是针对事务而言了

    from: http://hi.baidu.com/zhang_gt/item/a5647916cbfd77ed9813d604
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值