我有一个多线程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
有关为何发生这种情况的任何想法? 谢谢!
答案 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)
我认为这归因于网络的不稳定性。这种情况很少发生,并且在相当长的几个月里没有让它变得丑陋。