【发布时间】:2009-06-11 19:11:07
【问题描述】:
这篇文章的基本问题是“为什么非推广的 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();
}
谢谢
【问题讨论】:
-
否,数据库未镜像。这也不仅仅发生在一个或两个环境中,而是在几十个环境中
-
你试过在serverfault上提问吗?甚至向微软提出支持请求。找到答案后请发布...
标签: c# sql-server-2005 transactions transactionscope system.transactions