这篇文章的基本问题是“为什么非推广的 LTM 交易会受到质疑?”
我收到 System.Transactions.TransactionInDoubtException ,我无法解释原因。不幸的是,我无法重现此问题,但根据跟踪文件,它确实发生了。我正在使用 SQL 2005,连接到一个数据库并使用一个 SQLConnection,所以我不希望进行升级。错误消息指示超时。但是,有时我会收到一条超时消息,但例外是事务已中止而不是有疑问,这更容易处理。
这是完整的堆栈跟踪:
System.Transactions.TransactionInDoubtException:事务有问题。---> System.Data.SqlClient.SqlException:超时已过期。在操作完成之前超时时间已过或服务器没有响应。 在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,布尔 breakConnection) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 在 System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj,UInt32 错误) 在 System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult,TdsParserStateObject stateObj) 在 System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() 在 System.Data.SqlClient.TdsParserStateObject.ReadBuffer() 在 System.Data.SqlClient.TdsParserStateObject.ReadByte() 在 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj) 在 System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(字节 [] 缓冲区,TransactionManagerRequestType 请求,字符串 transactionName,TransactionManagerIsolationLevel isoLevel,Int32 超时,SqlInternalTransaction 事务,TdsParserStateObject stateObj,布尔 isDelegateControlRequest) 在 System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest transactionRequest,字符串 transactionName,IsolationLevel iso,SqlInternalTransaction internalTransaction,布尔 isDelegateControlRequest) 在 System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransaction(TransactionRequest transactionRequest,字符串名称,IsolationLevel iso,SqlInternalTransaction internalTransaction,布尔 isDelegateControlRequest) 在 System.Data.SqlClient.SqlDelegatedTransaction.SinglePhaseCommit(SinglePhaseEnlistment 登记) --- 内部异常堆栈跟踪结束 --- 在 System.Transactions.TransactionStateInDoubt.EndCommit(InternalTransaction tx) 在 System.Transactions.CommittableTransaction.Commit() 在 System.Transactions.TransactionScope.InternalDispose() 在 System.Transactions.TransactionScope.Dispose()
有任何想法吗?为什么我会怀疑,当我得到它时应该怎么做?
编辑以获取更多信息
我实际上仍然没有这个答案。我确实意识到事务实际上是部分提交的。一个表得到插入,但另一个没有得到更新。代码被大量追踪,我没有太多的空间可以遗漏一些东西。
有没有办法可以很容易地找出交易是否已被促进。我们可以从堆栈跟踪中判断它是否存在吗?单阶段提交(在 strack 跟踪中)似乎对我没有任何提升,但也许我错过了一些东西。如果它没有得到提升,那它怎么可能有疑问。
另一个有趣的难题是我创建了当前事务的克隆。我这样做是为了解决这个问题。 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();
}
谢谢