我编写了一个程序来演示多线程DTC超时的行为。我有几个例外,似乎是随机的。所有这些简单的超时,还是其中一些指示更深层次的问题(连接池交互等)?
Microsoft分布式事务处理协调器(MS DTC)已取消分布式事务。
分布式事务已完成。在新事务或NULL事务中登记此会话。
与当前连接关联的事务已完成但尚未处理。必须先处理事务,然后才能使用连接执行SQL语句。
该操作对交易状态无效。
ExecuteReader需要一个开放且可用的连接。连接的当前状态已关闭。
以下是代码的数据部分:
using (DemoDataDataContext dc1 = new DemoDataDataContext(Conn1))
using (DemoDataDataContext dc2 = new DemoDataDataContext(Conn2))
{
WriteMany(dc1, 100); //generate 100 records for insert
WriteMany(dc2, 100000); //generate 100,000 records for insert
Console.WriteLine("{0} : {1}", Name, " generated records for insert.");
using (TransactionScope ts = new TransactionScope())
{
dc1.SubmitChanges();
dc2.SubmitChanges();
ts.Complete();
}
}
答案 0 :(得分:0)
所有这些异常都告诉我你有内存泄漏。对我来说,这些例外不仅仅是一些简单的超时,我认为你应该寻找更深层次的问题。
ts.Complete()
不保证提交交易。
它只是向交易经理通知您的状态的一种方式。 http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.complete.aspx
是否是一个问题,您通知事务管理员您的交易实际上并非完整?