日期:2014-05-16  浏览次数:20408 次

同时插入同一行记录,产生阻塞的处理分析(4号锁分析)

之前有个客户提出,在insert的时候被hang住了,碰到这样的问题很可能是锁的问题。对于这样的问题我一般就会想到几个常用的视图:v$lock/v$transaction/v$session/v$sql,仔细观察就可以查出问题的所在。
  好,那我们现在去分析一下上面的现象,分析问题的一个常规手段就是能模拟故障的重现,我来试试模拟一下:

  1.查出当前操作的会话号为125
  SQL> select sid from v$mystat where rownum=1;

       SID
  ----------
       125
 
  2.创建表及插入数据
 SQL>  create table t_gyj(id int primary key,name varchar2(10));

 Table created.

 SQL> insert into t_gyj values(1,'gyj1');


 1 row created.

  注意这里先不要commit(提交).


 3.再开一个会话,会话号为17

 SQL> select sid from v$mystat where rownum=1;

       SID
   ----------
        17 

 4.在17号会话上插入同样的一条记录,这时被阻塞了.

 SQL> insert into t_gyj values(1,'gyj1');


 这里就出现了上面提到的同时插入同一行记录,产生阻塞的现象,现象出现我们如何判断分析呢?


 5.开始分析,刚刚提到几个视图v$lock,v$transaction,v$session,v$sql,这几个视图是DBA必须的.

 为了方便查询,我在上面的操作特意把会话号给显示一下125号和17号会话.
 
 被阻塞了我们一般首先会想到是不是锁住了
 
 OK,我再开一个会话:
 SQL>  select sid from v$mystat where rownum=1;

       SID
   ----------
        19

 
 SQL> set linesize 1000
 SQL>  select * from v$lock where sid in (125,17);

ADDR             KADDR                   SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
00000003A445F998 00000003A445F9F0        125 AE        100          0          4          0        883          0
00000003A44601D0 00000003A4460228         17 AE        100          0          4          0        595          0
00000003A44602A0 00000003A44602F8         17 TX     327681       1022          0          4        474          0
FFFFFD7FFC9F2040 FFFFFD7FFC9F20A0         17 TM      74868          0          3          0        474          0
FFFFFD7FFC9F2040 FFFFFD7FFC9F20A0        125 TM      74868          0          3      &nb