这个SqlTransaction已经完成; 它不再可用

Var*_*rpi 6 .net .net-4.0 linq-to-sql

我使用Linq to SQL与SQL Server 2008 SP2,我的应用程序是WinForm .net 4我导入到SQL Server 200,000记录.我正在创建对象并将它们附加到"insertonsubmit"上的datacontext.然后我每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()
Run Code Online (Sandbox Code Playgroud)

出乎意料.该错误不一致,可能出现在10,000条记录或27,200条记录或XXX条记录之后.

因为错误似乎是随机的,所以我认为它与垃圾收集有关...

有人有线索吗?

Mar*_*ell 2

SubmitChanges有隐式交易。这里的问题是你的交易超时了——你只是做得太多了。对于 200k 行,我将使用SqlBulkCopy到临时表中,然后运行命令或 SPROC 将这 200k 行移动到实际表中;也许在事务中使用该命令/SPROC。

SqlBulkCopy是专为这种情况设计的- 它是一个连续流或原始 TDS 数据,而不是然而可能的往返 - 并且在服务器端它也进行了优化(但因此,您必须使用临时表,否则您将面临风险插入未记录)。

  • 我已经找到了问题的解决方案。我的机器之间似乎存在带有“加载规则”的防火墙。 (2认同)