2011-02-08 81 views
5

在事務Scope.Eg中使用Nhibernate和ADO.Net操作時,出現以下異常。 Nhibernate 2.1沒問題,但現在升級到了3.0,導致錯誤。Nhibernate with TransactionScope錯誤 - DTC事務預先階段失敗 - 升級到Nhibernate 3.0

using (var scope = new TransactionScope(TransactionScopeOption.Required)) 
{ 
     GetmemberId(); --> NHibernate Call 
     Update(); ADO Call OracleDB 
} 

由於這個作爲環境事務,NHibernate的嘗試很快就處理交易之前外部事務completes.correct我,如果我錯了,有沒有什麼辦法,因爲幫助我,但是當我向外移動的NHibernate的通話TransactionScope一切正常。我已經給出的例子是一個樣本,礦山涉及更復雜的一個,因爲我有保持內外的TransactionScope的電話和蔭收到錯誤是如下,

錯誤13 NHibernate.Impl.AbstractSessionImpl - DTC事務prepre 階段失敗System.ObjectDisposedException:無法訪問處置的 對象。對象名稱:'交易'。在 System.Transactions.Transaction.DependentClone(DependentCloneOption cloneOption)在 System.Transactions.TransactionScope.SetCurrent(事務 newCurrent)在System.Transactions.TransactionScope.PushScope()
在System.Transactions.TransactionScope.Initialize(事務 transactionToUse,時間跨度scopeTimeout,布爾interopModeSpecified) 在System.Transactions.TransactionScope..ctor(事務 transactionToUse)在 NHibernate.Transaction.AdoNetWithDistributedTransactionFactory.DistributedTransactionContext.System.Transactions.IEnlistmentNotification.Prepare(PreparingEnlistment preparingEnlistment)2011-02- 08 13:41:46,033錯誤13 NHibernate.Impl.AbstractSessionImpl - DTC事務prepre階段 失敗System.ObjectDisposedException:無法訪問處置的 對象。對象名稱:'交易'。在 System.Transactions.Transaction.DependentClone(DependentCloneOption cloneOption)在 System.Transactions.TransactionScope.SetCurrent(事務 newCurrent)在System.Transactions.TransactionScope.PushScope()
在System.Transactions.TransactionScope.Initialize(事務 transactionToUse,時間跨度scopeTimeout,布爾interopModeSpecified) 在System.Transactions.TransactionScope..ctor(事務 transactionToUse)在 NHibernate.Transaction.AdoNetWithDistributedTransactionFactory.DistributedTransactionContext.System.Transactions.IEnlistmentNotification.Prepare(preparingEnlistment preparingEnlistment)

回答

6

嘗試

Configuration.SetProperty(Environment.TransactionStrategy,"NHibernate.Transaction.AdoNetTransactionFactory")

或者在NHibernate的配置

<property name="transaction.factory_class"> 
NHibernate.Transaction.AdoNetTransactionFactory 
</property> 

它爲我=)

+0

謝謝!它也適用於我! – Saxophonist 2015-02-09 12:05:14

1

我們遇到了同樣的錯誤,它是由的方式造成我們在NHibernate的Web API中使用會話和事務。

我們應該一直在使用session-per-request。 (這可以是Web請求或執行NServiceBus處理程序。)當請求開始時,您應該打開一個會話並開始一個事務。

我們沒有這樣做。在我們的倉庫中,我們爲每個數據庫請求創建了一個新的會話和事務。這意味着,我們有很多請求,而不是爲請求提供單個會話/事務。

錯誤的根源在於我們在一個會話中加載實體(域模型對象),修改它並使用不同的會話保存它。當NHibernate執行更新調用時,加載會話/事務已經被提交,刷新和關閉。

解決方案是將我們的會話/事務創建從存儲庫中提取出來並傳遞到Controller層(可以使用HttpModule進行REST調用和/或使用依賴注入進行面向方面編程)。這個會話/事務在REST調用或NServiceBus處理程序執行的整個生命週期中都存在,並且在該調用期間用於所有數據庫訪問。當該通話結束時,它將被適當地提交或回滾。

上面給出的答案設置配置屬性只是關閉DTC並恢復到NHibernate事務的舊方式。如果您不需要將Web Api擴展到多個實例,那麼這可能會爲您解決問題,但如果這樣做,則會導致問題。