日期:2014-05-16 浏览次数:20408 次
之前有个客户提出,在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