2011-09-04 107 views
1

即使我沒有使用任何明確的表鎖,並且我的隔離級別設置爲READ COMMITTED,我得到此錯誤Message: ORA-00060: deadlock detected while waiting for resourceOracle死鎖沒有顯式鎖定和讀提交隔離級別,爲什麼?

我使用默認傳播的彈簧TransactionTemplate上的多個線程。在我的業務邏輯中,數據是分開的,因此兩個事務永遠不會有相同的一組數據。因此,我不需要SERIALIZABLE

爲什麼Oracle可以檢測到死鎖?殭屍在這個星座是不可能的,或者我錯過了什麼?如果我沒有遺漏任何東西,那麼我的分離算法一定是錯的,對吧?或者可以有其他解釋嗎?

+1

當Oracle檢測到死鎖時,會生成死鎖跟蹤文件。你能得到這個文件嗎(或者要求你的DBA發送給你)?有很多可能性,但死鎖跟蹤文件會告訴你到底發生了什麼。 –

回答

4

Oracle默認進行行級鎖定。你提到使用多個線程。我懷疑一個線程正在鎖定一行,然後試圖鎖定另一個線程已鎖定的另一個線程。那另一個線程然後試圖鎖定第一個線程鎖定的行。此時,Oracle會自動檢測到一個死鎖並將其分解。上面提到的兩行可以在同一個表中或不同的表中。

仔細檢查每個線程正在做什麼是一個起點。可能有必要決定不要並行運行,或者可能需要使用顯式鎖定機制(例如,選擇更新)。

LMK的你發現和任何額外的問題...。

ķ

+0

好的,我會盡力找到那個轉儲。但是從更一般的觀點來看:我給出了不相交的線程邏輯卡盤。那麼這段代碼肯定會被破壞,並且提供一些不會丟失的夾頭? –

+0

如果您的每個線程都觸及不同的表格,則會使問題更加有趣。從賈斯汀和史蒂夫建議的跟蹤文件開始,是下一步最好的一步。 –

1

時碰到死鎖無關本身與序列水平。當一行被插入/更新/刪除oracle鎖定該行時。如果您有兩個事務同時運行並試圖更改同一行,則可能會遇到死鎖。強調「CAN」。如果不同類型的事務以不同順序鎖定,這通常會發生,這是錯誤事務設計的一個標誌。

如前所述,遇到死鎖時會生成跟蹤文件。如果您查看跟蹤文件,則可以確定死鎖中涉及哪兩個會話。另外它還顯示了相應的SQL語句。

相關問題