我已經設置了NHibernate以便在MS Sql Server 2008的windows服務中運行。我使用常規的TransactionScope來確保操作是原子操作。 NHibernate設置爲每個程序集創建一個會話工廠。多個會話的NHibernate事務問題
我想從3個不同的程序集中編寫對象的更改。 當我使用一個或兩個程序集時,一切正常,但是當我從第三個程序集中添加閱讀時,我遇到了問題。
I.e.讀取/寫入兩個程序集中的對象和寫入對象都可以正常工作,添加程序集中的對象會產生問題。但是,從第三個程序集中讀取而不使用另外兩個程序集中的對象也可以正常工作。我有一種感覺,會議正在爲對方造成問題。
我的代碼是這樣的:
using (var scope = new TransactionScope())
{
//Read object 1
//Do changes to object 2
//Do changes to object 3
scope.Complete();
}
當我試圖完成我的交易範圍(通過scope.Complete()),我收到以下錯誤信息:
System.Data.SqlClient.SqlException: Microsoft Distributed Transaction Coordinator (MS DTC) has stopped this transaction.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel, Int32 timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, Boolean isDelegateControlRequest)
at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest transactionRequest, String transactionName, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)
at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransaction(TransactionRequest transactionRequest, String name, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)
at System.Data.SqlClient.SqlDelegatedTransaction.SinglePhaseCommit(SinglePhaseEnlistment enlistment)
System.Transactions.TransactionAbortedException: The transaction has aborted.
at System.Transactions.TransactionStatePromotedAborted.PromotedTransactionOutcome(InternalTransaction tx)
at System.Transactions.TransactionStatePromotedEnded.EndCommit(InternalTransaction tx)
at System.Transactions.CommittableTransaction.Commit()
at System.Transactions.TransactionScope.InternalDispose()
at System.Transactions.TransactionScope.Dispose()
有什麼想法?
爲什麼你不使用一個會議工廠的3個組件?有什麼特殊需要? – Pedro 2010-11-02 17:07:39