这个SqlTransaction已经完成,不能再使用了。

6
我正在使用Linq to SQL与SQL Server 2008 SP2,我的应用程序是WinForm .net 4。我正在导入20万条记录到SQL Server中。我创建对象并将它们附加到“insertonsubmit”上的数据上下文中。然后,我每100条记录执行一次“submitChanges”。我完全没有事务。
我遇到了这个错误:
 "This SqlTransaction has completed; it is no longer usable." with stack
at System.Data.SqlClient.SqlTransaction.ZombieCheck()
   at System.Data.SqlClient.SqlTransaction.Rollback()
   at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
   at System.Data.Linq.DataContext.SubmitChanges()

突然出现错误。 该错误不一致,可能在10,000条记录、27,200条记录或XXX条记录后出现。

由于错误似乎是随机出现的,我认为这可能与垃圾回收有关...

有人有线索吗?


1
你能给我们展示一些获取数据上下文并将对象附加到其中的代码吗? - Luis
1个回答

2
SubmitChanges有一个隐式事务。这里的问题是您的事务超时了 - 您只是做了太多事情。对于200k行,我会使用SqlBulkCopy到暂存表中,然后运行一个命令或SPROC将那200k移动到实际表中;也许该命令/SPROC在一个事务中。 SqlBulkCopy为此场景而设计的 - 它是一个连续的原始TDS数据流,而不是多次往返 - 并且在服务器端它也被优化了(但作为结果,您必须使用一个暂存表,否则您可能会冒着插入未被记录的风险)。

2
我已经找到了这个问题的解决方案。看起来我的机器和“负载规则”之间有一个防火墙。 - Varpi
你能更具体地说明如何修复这个问题吗?我也遇到了这个问题,在我的防火墙上没有看到任何相关信息。是Windows防火墙还是其他什么东西导致的?此外,楼主说他在每100条记录提交一次更改,所以Marc Gravell的说法不合理。 - Andrew Mao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接