我有一個Oracle數據庫包,經常導致我認爲是ITL(Interested Transaction List)的死鎖。跟蹤文件的相關部分如下。識別和解決Oracle ITL死鎖
Deadlock graph:
---------Blocker(s)-------- ---------Waiter(s)---------
Resource Name process session holds waits process session holds waits
TM-0000cb52-00000000 22 131 S 23 143 SS
TM-0000ceec-00000000 23 143 SX 32 138 SX SSX
TM-0000cb52-00000000 30 138 SX 22 131 S
session 131: DID 0001-0016-00000D1C session 143: DID 0001-0017-000055D5
session 143: DID 0001-0017-000055D5 session 138: DID 0001-001E-000067A0
session 138: DID 0001-001E-000067A0 session 131: DID 0001-0016-00000D1C
Rows waited on:
Session 143: no row
Session 138: no row
Session 131: no row
該表沒有位圖索引,所以這不是原因。據我所知,缺乏「等待行」加上服務員等待列中的「S」可能表明這是ITL的僵局。此外,該表經常寫入(大約8次插入或更新,每分鐘240次),所以ITL的死鎖似乎是一種很強的可能性。
我增加了表的INITRANS參數,它的索引爲100,並將表上的PCT_FREE從10增加到20(然後重建索引),但死鎖仍在發生。僵局似乎在更新過程中最常發生,但這可能只是一個巧合,因爲我只追蹤了它幾次。
我的問題是雙重的:
1)這實際上是ITL的僵局嗎?
2)如果這是ITL僵局,還有什麼可以避免呢?
事實證明,這根本不是ITL的死鎖問題,而是未索引的外鍵問題。我發現這要歸功於dpbradley的回答,這讓我意識到這不是ITL問題,並促使我找出導致「無行」的死鎖的其他原因。
你可能要考慮發佈這在serverfault。我最初的反應是這就是它所屬的地方,但這個問題也有一個編程風格。無論如何,你可能會在那裏找到另一雙不在這裏的眼睛。 – DCookie 2010-05-24 18:11:29