深入分析 enq: TX - row lock contention

来源:互联网 发布:淘宝设置宝贝详情技巧 编辑:程序博客网 时间:2024/05/16 17:42

[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: oracle@roger (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: oracle@roger (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: sqlplus@roger (TNS V1-V3)
    application name: sqlplus@roger (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属于事务级别。原理跟第一类似,不过是针对事务而言了。