我有一个应用程序,可能会在SQL Server 2005数据库中进行数千次插入操作。如果由于任何原因(例如外键约束、字段长度等)插入失败,则该应用程序将记录插入错误并继续。
每个插入操作都是独立的,因此不需要事务来保证数据库完整性。但是,我们希望使用它们来获得更好的性能。当我使用事务时,大约每100次提交就会出现以下错误。
This SqlTransaction has completed; it is no longer usable.
at System.Data.SqlClient.SqlTransaction.ZombieCheck()
at System.Data.SqlClient.SqlTransaction.Commit()
为了找出原因,我在每个事务操作处都放置了跟踪语句,以确保在调用提交之前没有关闭事务。我确认我的应用程序没有关闭事务。然后,我再次使用完全相同的输入数据运行应用程序,它成功了。如果我关闭日志记录,它会再次失败。重新开启日志记录,它又成功了。通过应用程序配置文件进行此打开/关闭切换,无需重新编译。
明显地,日志记录的动作改变了时序并导致它能够工作。这表明存在线程问题。但是,我的应用程序不是多线程的。
我看到了一篇微软知识库文章,指出 .Net 2.0 框架中的一个错误可能会导致类似的问题(http://support.microsoft.com/kb/912732)。但是,他们提供的修复方法不能解决此问题。