2014-12-03 124 views
0

我有兩個進程同時訪問相同的數據庫表。 這兩個進程都使用NHibernate-3.2.0。 一個進程刪除行,另一個進程將行插入到相同的表中。 當兩個進程並行工作時,我在「INSERT」進程中收到死鎖錯誤。當兩個進程訪問數據庫時NHibernate事務死鎖

[錯誤] TID:6 NHibernate.Util.ADOExceptionReporter - 事務(進程ID 64)在另一個進程鎖死資源上死鎖,並被選爲死鎖犧牲品。重新運行交易。

該插入在事務內部執行爲session.Save(obj)。 對象ID有Guid類型,生成器類是「guid.comb」。

看起來好像NHibernate試圖處理這種情況,執行多次插入行的嘗試。在NHibernate sql日誌文件中,我看到與同一個ID相同的表的INSERT語句的數量。

而下面是下一個錯誤: [錯誤] TID:6 Hibernate.Util.ADOExceptionReporter - 違反PRIMARY KEY約束。

問題:

  1. 是否有可能阻止我scenarion死鎖情況由 NHibernate的別的技能?
  2. 可以防止從NHibernate到 執行多行嘗試插入行處理問題我的代碼(NHibernate外部) ?

在此先感謝,當兩個或多個進程都在等待訪問已被其他進程持有資源發生

+0

這兩個進程是否使用相同的NHSession?你在使用交易嗎?你什麼時候提交或沖洗? – 2014-12-03 14:03:47

回答

0

死鎖。爲防止死鎖,您必須確保至少有一個進程始終能夠繼續。確保這一點的一個策略是訂購你的鎖。如果兩個進程始終以相同的順序獲取鎖,則不會發生死鎖,因爲如果進程成功獲取第一個鎖,則意味着第二個鎖必須是空閒的(或由某些不需要第一個鎖的鎖保留)不需要等待該鎖被釋放)。

實現這一目標的一種方法是讓這兩個進程都獲取表鎖。您還可以分析SQL服務器中的進程以查找他們獲取的鎖以及他們正在等待的內容。至於第二部分,我懷疑NHibernate本身是否正在重試INSERT語句。您是否遵循了立即回滾並放棄發生異常的事務和NHibernate會話的所需做法?