一、表加鎖、死鎖出現的現象
1、對數據庫操作update、insert、delete時候,數據庫無法更新,操作等待時長,操作結果不發生改變;
2、在程序中,底層(數據訪問層)操作時候不成功,數據庫連接超時,無法操作,或者操作等待時長等現象。
加鎖原理:如果一個操作在進行修改一表,它沒完成,另一個操作也操作這張表時候就需要等待,前面操作結束之后才可進行操作。
二、表加鎖、導致死鎖原因
1、可能在Oracle中可以有計時器,在頻繁操作數據庫update、insert、delete語句。
2、可能在.net程序中使用到timer控件,頻繁地操作數據庫update、insert、delete語句。
3、可能使用到事務處理(Tran),沒有提交事務(CommintTran)或者沒有回滾事務(Rollback)
【注釋】:在SqlServer數據庫里面有一個隱式事務,關閉時候,每次修改插入都需要手動提交,不然就會導致死鎖。
三、解決方案
步驟為:
1、執行下面SQL,先查看哪些表被鎖住了:
select b.owner,b.object_name,a.session_id,a.locked_mode
from v$locked_object a,dba_objects b
where b.object_id = a.object_id;
2、查處引起死鎖的會話
select b.username,b.sid,b.serial#,logon_time
from v$locked_object a,v$session b
where a.session_id = b.sid order by b.logon_time;
這里會列出SID
SELECT s.username, l.OBJECT_ID, l.SESSION_ID, s.SERIAL#,
l.ORACLE_USERNAME, l.OS_USER_NAME, l.PROCESS
FROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;
3、 查出SID和SERIAL#:
查V$SESSION視圖:
SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='剛才查到的SID';
這一步將得到PADDR
4、查V$PROCESS視圖:
SELECT SPID FROM V$PROCESS WHERE ADDR='剛才查到的PADDR';
這一步得到SPID
5、殺掉進程 sid,serial#,這里的兩個數是根據數據庫查詢得到的
alter system kill session'210,11562';