交易已中止

时间:2010-08-27 15:46:02

标签: c# .net sql-server sql-server-2005

我有一个多线程C#应用程序,其中每个线程都有自己的数据库连接集。每个线程使用TransactionScope / DTC。有时候,我得到一个“交易中止”的例外。它不是来自超时,因为它在启动事务后不到2秒就会发生。

这是堆栈跟踪:

  

在   System.Transactions.TransactionStateAborted.BeginCommit(InternalTransaction   tx,Boolean asyncCommit,AsyncCallback   asyncCallback,Object asyncState)at   System.Transactions.CommittableTransaction.Commit()   在   System.Transactions.TransactionScope.InternalDispose()   在   System.Transactions.TransactionScope.Dispose()   在MyNamespace.CallingMethod()

它很少发生,比如10万次交易。

环境: Windows Server 2003 .Net 2.0 连接到SqlServer 2005

有关为何发生这种情况的任何想法? 谢谢!

5 个答案:

答案 0 :(得分:1)

这个调用堆栈是否来自最内部的InnerException?我得到这个例外,通常(但不总是)有一个包含更多信息的InnerException。

我的赌注是数据库死锁。

答案 1 :(得分:1)

您可以创建内存转储,可在此处找到该指令 http://blogs.msdn.com/b/joncole/archive/2007/03/29/creating-a-process-memory-dump.aspx

然后你可以查看windbg来揭示导致此问题的根异常。关于如何使用windbg检查托管异常有很多有用的信息。

同时,您可以使用sql profiler监视抛出异常时是否发生任何sql错误。

答案 2 :(得分:1)

如果您有任何人遇到此问题,请注意我找到了解决方案和问题..在应用配置文件中,缺少连接字符串的属性,即“Enlist”,。

之前连接字符串是= <add name="HIS_Test_12" connectionString="server=OXYGEN\SQL2008ENT;database=CHIS_VN_12;UID=sa;Password=1234;Max Pool Size=100;Connect Timeout=200;" providerName="System.Data.SqlClient" />

现在更新的连接字符串是= <add name="HIS_Test_12" connectionString="server=OXYGEN\SQL2008ENT;database=CHIS_VN_12;UID=sa;Password=1234;Max Pool Size=100;Connect Timeout=200;Enlist=False;" providerName="System.Data.SqlClient" />

答案 3 :(得分:0)

正如安德烈亚斯所说,看看InnerExceptions。还可以连接SQL事件探查器并查找任何死锁/终止。

答案 4 :(得分:0)

我认为这归因于网络的不稳定性。这种情况很少发生,并且在相当长的几个月里没有让它变得丑陋。