(4號鎖分析之Unique key的約束)
之前有個客戶提出,在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 0 565 0
00000003A2CFF908 00000003A2CFF980 17 TX 458765 764 6 0 474 0
00000003A2D3E928 00000003A2D3E9A0 125 TX 327681 1022 6 0 565 1