Основной вопрос к этому сообщению: «Почему не продвигаемая транзакция LTM когда-либо будет подвергаться сомнению?»
Я получаю исключение System.Transactions.TransactionInDoubtException и не могу объяснить, почему. К сожалению, я не могу воспроизвести эту проблему, но, согласно файлам трассировки, это действительно происходит. Я использую SQL 2005, подключаюсь к одной базе данных и использую один SQLConnection, поэтому я не ожидаю, что продвижение будет иметь место. Сообщение об ошибке указывает на тайм-аут. Однако иногда я получаю сообщение об истечении времени ожидания, но исключение состоит в том, что транзакция прервана, а не сомневается, что гораздо проще обрабатывать.
Вот полная трассировка стека:
System.Transactions.TransactionInDoubtException: The transaction is in doubt. ---> System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()
at System.Data.SqlClient.TdsParserStateObject.ReadBuffer()
at System.Data.SqlClient.TdsParserStateObject.ReadByte()
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)
--- End of inner exception stack trace ---
at System.Transactions.TransactionStateInDoubt.EndCommit(InternalTransaction tx)
at System.Transactions.CommittableTransaction.Commit()
at System.Transactions.TransactionScope.InternalDispose()
at System.Transactions.TransactionScope.Dispose()
Есть идеи? Почему я в сомнении и что мне делать, когда я получу это?
РЕДАКТИРОВАТЬ для получения дополнительной информации
На самом деле у меня до сих пор нет ответа на этот вопрос. Я понял, что транзакция частично совершается. Одна таблица получает вставку, а другая не получает обновление. Код тяжело прослеживается, и у меня не так много места, чтобы что-то упустить.
Есть ли способ, которым я могу легко узнать, была ли сделка продвинута. Можем ли мы узнать из трассировки стека, если это так? Похоже, что одиночная фазовая фиксация (которая находится в следовом потоке) указывает на отсутствие продвижения по службе, но, возможно, я что-то упустил. Если его не продвигают, то как это может быть под вопросом.
Еще одна интересная часть головоломки состоит в том, что я создаю клон текущей транзакции. Я делаю это как обходной путь к этой проблеме.
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=914869&SiteID=1
К сожалению, я не знаю, была ли решена эта проблема. Возможно, создание клона вызывает проблемы. Вот соответствующий код
using (TransactionScope ts = new TransactionScope())
{
transactionCreated = true;
//part of the workarround for microsoft defect mentioned in the beginning of this class
Transaction txClone = Transaction.Current.Clone();
transactions[txClone] = txClone;
Transaction.Current.TransactionCompleted += new TransactionCompletedEventHandler(TransactionCompleted);
MyTrace.WriteLine("Transaction clone stored and attached to event");
m_dataProvider.PersistPackage(ControllerID, package);
MyTrace.WriteLine("Package persisted");
m_dataProvider.PersistTransmissionControllerStatus(this);
MyTrace.WriteLine("Transmission controlled updated");
ts.Complete();
}
Спасибо