2013-10-21 69 views
0

我希望能夠在死鎖發生時重新運行事務。在Ayende's blog post他提到你需要扔掉整個NHibernate會話並重新開始。在Session-Per-Request Web環境中發生死鎖後重新發生事務

重新啓動會話在Windows應用程序中相對比較簡單,但是如何在使用Session-Per-Request模塊時在Web應用程序中執行此操作?會話在IHttpModule中打開和關閉。我能想到的唯一方法是以某種方式重新發布http帖子。這很麻煩,並且最終還會重新執行已成功提交的其他事務(因爲我們每個會話都有多個事務)。

+0

另一種方法是找出爲什麼僵局首先發生。看看死鎖圖。也許通過更改程序或添加索引來修復死鎖。 –

+0

是的,這就是大家都說的,但是如果僵局已經發生,那就太遲了。 – cbp

+0

有點太晚了?這是你唯一能夠解決死鎖的時間。如果您正在運行mssql,則設置一個跟蹤來捕獲死鎖事件,包括死鎖圖。通過查看兩個陳述是否僵持,你將學到很多東西。我多次遇到這種情況。 –

回答

0

您需要以某種方式公開ISessionFactory,以便您可以在需要時使用它創建新的ISession。一個快速解決方案是在global.asax中設置靜態屬性。

+0

是的我知道如何創建一個新的會話,問題是如何構建一個解決方案來重新運行失敗的事務。 – cbp

+0

您在什麼時候重新運行交易?在每個控制器的代碼?在一個Http模塊中? – cbp

+0

我會將操作封裝在自己的類中(命令模式),並使用新會話重新在控制器中運行事務。但是,我的經驗是,當交易失敗時,通常需要用戶交互。我還會投入更多的精力來防止僵局(我的經驗很少見),而不是試圖自動重新嘗試。 –