Завершение саги вызывает ошибку завершения распределенной транзакции - PullRequest
1 голос
/ 30 января 2012

Порядок обработки:

  • Обработчик сообщений Saga получает первое сообщение, содержащее элементы данных.
  • Обработчик сообщений использует бизнес-объекты, которые имеют собственную транзакцию базы данных.
  • Еслиэлементы обновляются в порядке, транзакция базы данных фиксируется и сага завершается.
  • Обработчик сообщений Saga получает второе сообщение, содержащее элементы данных.
  • Обработчик сообщений создает исключение при попытке открыть новую транзакцию базы данных, как указано выше.

Сообщение об ошибке:

System.Data.SqlClient.SqlException (0x80131904): Distributed transaction completed. Either enlist this session in a new transaction or the NULL transaction.

Трассировка стека:

2012-01-27 14:07:47,407 [Worker.9] ERROR 

LawCover.LISServices.LISBankAgent.SagaMessageHandler [(null)] - Exception details
System.Data.SqlClient.SqlException (0x80131904): Distributed transaction completed. Either enlist this session in a new transaction or the NULL 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()
   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.SqlInternalConnection.BeginSqlTransaction(IsolationLevel iso, String transactionName)
   at System.Data.SqlClient.SqlConnection.BeginTransaction(IsolationLevel iso, String transactionName)
   at System.Data.SqlClient.SqlConnection.BeginTransaction()
   at LawCover.LIS.DataAccess.ConnectionManager.BeginTransaction()
   at LawCover.LISServices.LISBankAgent.LISMethods.AddCreditCardPaymentSettlementScheduleItemsAndReceiptsIntoLISForCurrentMessages(BankResponseFileProcessed message) in C:\Projects\LIS Improvements\LIS\Source\LISServices\LISBankAgent\LISMethods.cs:line 53
   at LawCover.LISServices.LISBankAgent.SagaMessageHandler.Handle(BankResponseFileProcessed message) in C:\Projects\LIS Improvements\LIS\Source\LISServices\LISBankAgent\SagaMessageHandler.cs:line 177

Довольно много кода покрывает вышеуказанный поток, но я рад опубликовать то, что будетполезно.

1 Ответ

3 голосов
/ 03 февраля 2012

Я отменил транзакции и обнаружил, что обработчик саги открывает другое соединение с базой данных, и по умолчанию соединение зачисляется в DTC. Я добавил «Enlist = false» в строку подключения, так как исключения, создаваемые базой данных, необходимо перехватывать и обрабатывать соответственно, а не сворачивать распределенную транзакцию. Теперь он ведет себя как ожидалось.

Спасибо за ваш вклад, я буду пересматривать код и принимать ваши комментарии.

...