2010-08-27 110 views
5

我有一个多线程的C#应用​​程序,其中每个线程都有自己的一组数据库连接。每个线程使用TransactionScope/DTC。有时候,我会遇到“交易已中止”异常。它不是从超时开始的,因为它在发生事务后不到2秒内发生。交易已中止

这里的堆栈跟踪:

在 System.Transactions.TransactionStateAborted.BeginCommit(InternalTransaction TX,布尔asyncCommit,AsyncCallback的 的AsyncCallback,对象asyncState)在 System.Transactions.CommittableTransaction.Commit() 在 System.Transactions.TransactionScope.InternalDispose() 在 System.Transactions.TransactionScope.Dispose() 在MyNamespace.CallingMethod()

这种情况非常罕见,例如在100,000次交易中就发生过一次。

环境: Windows Server 2003的 NET 2.0 连接到SqlServer的2005

为什么这是发生任何想法? 谢谢!

+0

讲解SQL,DTC,或OS错误日志有任何其他细节? – StingyJack 2010-08-27 15:48:27

+0

具有该时间戳的事件日志中的任何条目? – 2010-08-27 15:50:37

+0

生产箱,所以很难在没有繁文get节的情况下获得任何信息。我会看看是否可以从事件日志中获取任何内容,这很容易。谢谢! – Dan 2010-08-27 15:59:58

回答

0

我认为这是由于网络不稳定。这是非常罕见的,并且在几个月内没有养成这个丑陋的头脑。

1

这是来自你最内部的InnerException的调用堆栈吗?我得到这个异常,通常(并非总是)有更多信息的InnerException。

我的赌注是数据库死锁。

+0

是的,这是最内在的例外。我有权访问死锁痕迹,在此期间没有发现任何死锁痕迹。 – Dan 2010-09-07 15:49:05

1

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

发现然后,你可以使用WinDbg检查揭示了什么是根异常导致出现此问题。有许多关于如何使用windbg检查托管异常的有用信息。

同时,您可以使用sql profiler来监视是否在引发异常的时候发生了任何sql错误。

+0

我喜欢这个想法。我将再次尝试在开发中重新创建这个问题并获得这个问题的答案。 – Dan 2010-09-07 15:52:51

+0

如果你有内存转储,我可以为你检查。你可以把它放在skydrive公用文件夹中。 – 2010-09-07 16:16:28

0

正如Andreas所说,看看InnerExceptions。还要连接SQL Profiler并查找任何死锁/终止。

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" />