MS Sql Server 2008 を使用して Windows サービスで実行するように NHibernate をセットアップしました。通常の TransactionScope を使用して、操作がアトミックであることを確認します。Hibernate は、アセンブリごとにセッション ファクトリを作成するように設定されています。
3 つの異なるアセンブリからオブジェクトに変更を書き込みたいと考えています。一度に 1 つまたは 2 つのアセンブリを操作するとすべて正常に動作しますが、3 つ目のアセンブリからの読み取りを追加すると問題が発生します。
つまり、2 つのアセンブリ内のオブジェクトの読み取り/書き込みは正常に機能しますが、アセンブリからオブジェクトを追加すると問題が発生します。ただし、他の 2 つのアセンブリのオブジェクトを操作せずに 3 番目のアセンブリから読み取ることも正常に機能します。セッションがお互いに問題を引き起こしているような気がします。
私のコードは次のようなものです:
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()
何かご意見は?