Oracle資料庫死鎖的解決辦法

2021-09-01 16:19:41 字數 3695 閱讀 2737

本文我們嘗試總結在多個使用者併發情況下,如何識別和解決刪除操作期間發生的死鎖問題,在開始之前,我們先簡單描述一下什麼是死鎖以及什麼東西會導致死鎖。

死鎖

在任何資料庫中發生死鎖都是不愉快的,即使是在乙個特殊的情況下發生也是如此,它們會減小應用程式的接受程度(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...