2012-01-30 2 views
1
порядка

процесса:завершения Saga причины распределенных транзакций Завершено Ошибка

  • 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

Посмотрите мои комментарии к другим сообщениям: http://stackoverflow.com/questions/9028331/why-does-nservicebus-saga-timeout-request-use-wrong-saga-id –

ответ

3

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

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