本文我們嘗試總結在多個使用者併發情況下,如何識別和解決刪除操作期間發生的死鎖問題,在開始之前,我們先簡單描述一下什麼是死鎖以及什麼東西會導致死鎖。
死鎖
在任何資料庫中發生死鎖都是不愉快的,即使是在乙個特殊的情況下發生也是如此,它們會減小應用程式的接受程度(acceptance),因此避免並正確解釋死鎖是非常重要的。
當兩個或更多使用者相互等待鎖定的資料時就會發生死鎖,發生死鎖時,這些使用者被卡住不能繼續處理業務,oracle自動檢測死鎖並解決它們(通過回滾乙個包含在死鎖中的語句實現),釋放掉該語句鎖住的資料,回滾的會話將會遇到oracle錯誤「ora-00060:等待資源時檢測到死鎖」。
是什麼導致了死鎖?
明確地鎖定表是為了保證讀/寫一致性,未建立索引的外來鍵約束,在相同順序下表不會鎖住,沒有為資料段分配足夠的儲存
引數(主要是指inittrans,maxtrans和pctfree引數)很容易引發突發鎖和死鎖,原因是多種多樣的,需要重新逐步審查。
識別死鎖
當oracle資料庫檢測到死鎖時(oracle錯誤訊息:ora-00060),相應的訊息就寫入到警告日誌檔案中(alert.log),另外還會在user_dump_dest目錄下建立乙個跟蹤檔案,分析警告日誌檔案和跟蹤檔案是非常耗時的。
下面是乙個警告日誌檔案示例:
mon aug 07 09:14:42 2007
ora-000060: deadlock detected. more info in file
e:\oracle\admin\gedeon\udump\ora01784.trc.
下面是從跟蹤檔案中節選出來的片段,從其中我們可以看出是哪個語句創造了死鎖,相關的語句和被鎖定的資源已經標記為粗體。
/users/ora00/log/odn_ora_1097872.trc
oracle9i enterprise edition release 9.2.0.8.0 - 64bit production
with the partitioning, olap and oracle data mining options
jserver release 9.2.0.8.0 - production
oracle_home = /soft/ora920
system name:aix
node name:beaid8
release:2
version:5
machine:00c95b0e4c00
instance name: odn
redo thread mounted by this instance: 1
oracle process number: 17
unix process pid: 1097872, image: oracle@beaid8 (tns v1-v3)
*** 2007-06-04 14:41:04.080
*** session id:(10.6351) 2007-06-04 14:41:04.079
deadlock detected ( ora-00060 )
the following deadlock is not an oracle error. it is a
or from issuing incorrect ad-hoc sql. the following
information may aid in determining the deadlock:
deadlock graph:
---------blocker(s)-------- ---------waiter(s)---------
resource name process session holds waits process session holds waits
tm-00001720-00000000 17 10 sx 16 18 sx ssx
tm-0000173a-00000000 16 18 sx 17 10 sx ssx
session 10: did 0001-0011-00000002session 18: did 0001-0010-00000022
session 18: did 0001-0010-00000022session 10: did 0001-0011-00000002
rows waited on:
session 18: obj - rowid = 00001727 - aaabcnaajaaaaaaaaa
(dictionary objn - 5927, file - 9, block - 0, slot - 0)
session 10: obj - rowid = 00001727 - aaabcnaajaaaaaaaaa
(dictionary objn - 5927, file - 9, block - 0, slot - 0)
information on the other waiting sessions:
session 18:
pid=16 serial=2370 audsid=18387 user: 21/odn
o/s info: user: mwpodn00, term: unknown, ospid: , machine: beaida
program: jdbc thin client
current sql statement:
delete from odnqtex where ex_id = :b1
end of information on other waiting sessions.
current sql statement for this session:
delete from odnqtfn where fn_id_exigence_ex = :b1
----- pl/sql call stack -----
object line object
handle number name
7000000135f7fd8 34 procedure odn.odnqpdr
7000000135f89f0 16 procedure odn.odnqpzb
我們可以使用企業管理器來決定保留所有的鎖還是釋放掉它們,為了便於說明,我們開啟2個sqlplus例項會話(在此期間同時發生了死鎖)來一起調式,當每個語句執行完畢後,我們看到鎖仍然保留下來了,它可以幫助我們識別出是哪個資源引起的死鎖。
下面列出了可以幫助我們監視鎖的檢視:
可以通過查詢v$lock字典檢視來確定鎖,如:
select * from v$lock ;
下面的sql查詢可以用於確定鎖住資料庫物件的鎖:
select
c.owner,
c.object_name,
c.object_type,
b.sid,
b.serial#,
b.status,
b.osuser,
b.machine
from
v$locked_object a ,
v$session b,
dba_objects c
where
b.sid = a.session_id
and
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...
Oracle資料庫死鎖解決方法
死鎖是資料庫經常發生的問題,資料庫一般不會無緣無故產生死鎖,死鎖通常都是由於我們應用程式的設計本身造成的。產生死鎖時,如何解決呢,下面是常規的解決辦法 1 執行下面sql,先檢視哪些表被鎖住了 select b.owner,b.object name,a.session id,a.locked mo...
oracle資料庫死鎖解決方法
在做專案中,在程式完全正確的情況下,出現了當執行sql語句的時候停止工作的現象,開始是懷疑出現了死鎖,當利用sql查詢時發現自己是對的,死鎖通常都是我們應用程式設計不合理造成的,如何處理資料庫中的死鎖呢?1.先看一下資料庫中那些表被鎖住了。select b.owner,b.object name,a...