**
一、資料庫死鎖的現象
程式在執行的過程中,點選確定或儲存按鈕,程式沒有響應,也沒有出現報錯。
二、死鎖的原理
當對於資料庫某個表的某一列做更新或刪除等操作,執行完畢後該條語句不提
交,另一條對於這一列資料做更新操作的語句在執行的時候就會處於等待狀態,
此時的現象是這條語句一直在執行,但一直沒有執行成功,也沒有報錯。
三、死鎖的定位方法
通過檢查資料庫表,能夠檢查出是哪一條語句被死鎖,產生死鎖的機器是哪一台。
1)用dba使用者執行以下語句
select username,lockwait,status,machine,program from v$session where sid in
(select session_id from v$locked_object)
如果有輸出的結果,則說明有死鎖,且能看到死鎖的機器是哪一台。字段說明:
username:死鎖語句所用的資料庫使用者;
lockwait:死鎖的狀態,如果有內容表示被死鎖。
status: 狀態,active表示被死鎖
machine: 死鎖語句所在的機器。
program: 產生死鎖的語句主要來自哪個應用程式。
2)用dba使用者執行以下語句,可以檢視到被死鎖的語句。
select sql_text from v$sql where hash_value in
(select sql_hash_value from v$session where sid in
(select session_id from v$locked_object))
四、死鎖的解決方法
一般情況下,只要將產生死鎖的語句提交就可以了,但是在實際的執行過程中。使用者可
能不知道產生死鎖的語句是哪一句。可以將程式關閉並重新啟動就可以了。
經常在oracle的使用過程中碰到這個問題,所以也總結了一點解決方法。
1)查詢死鎖的程序:
sqlplus "/as sysdba" (sys/change_on_install)
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;
2)kill掉這個死鎖的程序:
alter system kill session 『sid,serial#』; (其中sid=l.session_id)
3)如果還不能解決:
select pro.spid from v$session ses,v$process pro where ses.sid=xx and ses.paddr=pro.addr;
其中sid用死鎖的sid替換: exit
ps -ef|grep spid
其中spid是這個程序的程序號,kill掉這個oracle程序
select a.sql_text, b.username, c.object_id, c.session_id,
b.serial#, c.oracle_username,c.os_user_name,c.process,
''''||c.session_id||','||b.serial#||''''
from v$sql a, v$session b, v$locked_object c
where a.hash_value = b.sql_hash_value and
b.sid = c.session_id
關於資料庫死鎖
不鎖怕出事,鎖了又怕鎖死了!資料庫由於資料儲存速度快,資料穩定,結構化的特性,被廣泛用作資料儲存,並成為最重要,最常見的方式!資料庫從20世紀50年代誕生伊始,就因為支援事務的特性得到大力的發展,最終各種資料庫諸如oracle,sybase,mysql等關係型資料庫百花齊放,既然資料庫是因為事務而生...
oracle資料庫死鎖解決
進入oracle使用者 su oracle 進入dba模式 sqlplus as sysdba 1.查詢被鎖的情況 select object name,machine,s.sid,s.serial from v locked object l,dba objects o v session s w...
資料庫死鎖
1.死鎖的概念 死鎖是程序死鎖的簡稱,是由dijkstra於1965年研究銀行家演算法時首先提出來的。它是計算機作業系統乃至併發程式設計中最難處理的問題之一。實際上,死鎖問題不僅在計算機系統中存在,在我們日常生活中它也廣泛存在。我們先看看這樣乙個生活中的例子 在一條河上有一座橋,橋面較窄,只能容納一...