2012-11-21 58 views
4

我有一個WCF MSMQ服務(託管在Windows服務中)。我的方法有它的TransactionScopeRequired屬性。WCF與MSMQ DTC - 關閉NHibernate會話

我使用Nhibernate將我的數據保存到我的數據庫。我想確保在每次通話後關閉每個Nhibernate會話。

我用下面的方法(使用城堡設施)在我的數據訪問

using(var session = sessionManager.OpenSession()) 
using(var transaction = session.BeginTransaction()) 
{ 

// do work 
transaction.Commit() 

} 

但是,當我的主要服務方式退出我得到一個錯誤,因爲我已經配置NHibernate會話和我的認爲DTC需要這個來做它的承諾。

我的問題是:

什麼是關閉NHibernate會話的最佳方式 - DTC承諾後(即我已經離開我的服務方法後?)。

謝謝。

+1

您使用的方法應該可以工作,但是您不會聲明錯誤消息或NHibernate版本。 –

回答

3

如果您在以下

using (TransactionScope sc = new TransactionScope(TransactionScopeOption.Suppress)) 
{ 
    // code here 
    sc.Complete(); 
} 

包裝你的代碼的NHibernate不會在環境事務中登記,因此DTC不會對數據庫事務的依賴。

這是一種預感,因爲您尚未在您的問題中提供錯誤詳細信息。

編輯

當然通過這樣如果在你的數據庫中的失敗這可能會或可能不會導致出隊交易後這個建議數據庫提交將不會在相同的事務中出列作用下進行將正在處理的消息回滾到隊列中,因此您有可能以這種方式丟棄消息。您可以通過各種方式對此進行補償,或者如果丟棄消息的代價不高,您可以冒險運行。

+0

嗨,很抱歉有關延誤。哇休很好的回答。你的修復只是在最後一刻保存了我的培根!非常感謝。 (我會在星期一添加錯誤信息,當我回到工作時)。 – jonho

+0

不用擔心 - 我在上面添加了一個免責聲明... –

+0

但是想必如果nhibernate transaction.Commit()炸掉我的try catch會阻止我永遠進入範圍。完整 - 所以我應該罰款? – jonho