這篇文章的根本問題是「爲什麼非升級的LTM事務會有疑問?」在SQL Server 2005上使用System.Transactions的TransactionInDoubtException
我得到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()
任何想法?爲什麼我會懷疑,當我得到它時我該怎麼做?
編輯更多信息
我其實還沒有爲這個問題的答案。我確實意識到交易實際上部分承諾。一個表獲取插入,但另一個無法獲得更新。該代碼是嚴重追查,並沒有太多的空間讓我失去一些東西。
有沒有一種方法可以輕鬆找出交易是否已被提升。我們可以從堆棧跟蹤中知道它是否是? SIngle階段提交(這是在追蹤軌跡)似乎表明沒有提升給我,但也許我失去了一些東西。如果它沒有得到提升,那麼它怎麼會有疑問。
另一個有趣的難題是我創建了當前事務的克隆。我將其作爲此問題的解決方案。 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();
}
感謝
是數據庫鏡像? – 2009-06-11 22:10:41
否數據庫不鏡像。這也不僅僅發生在一個或兩個環境中,而是發生在其中一兩個環境中 – Mark 2009-06-12 18:23:43
您是否試過在[serverfault](http://serverfault.com/)上詢問?甚至可以向微軟提出一項移交請求。當你發現它時,請發佈答案... – 2009-09-22 13:41:51