我有一个应用程序可能会对SQL Server 2005数据库进行数千次插入.如果插入因任何原因(外键约束,字段长度等)而失败,则应用程序将记录插入错误并继续.
每个插入都独立于其他插入,因此数据库完整性不需要事务.但是,我们希望使用它们来提高性能.当我使用事务时,我们将在每100次提交中大约有1次出现以下错误.
This SqlTransaction has completed; it is no longer usable.
at System.Data.SqlClient.SqlTransaction.ZombieCheck()
at System.Data.SqlClient.SqlTransaction.Commit()
Run Code Online (Sandbox Code Playgroud)
为了尝试追踪原因,我在每个事务操作中都放置了trace语句,这样我就可以确保在调用commit之前没有关闭事务.我已经确认我的应用程序不会关闭交易.然后我使用完全相同的输入数据再次运行应用程序并成功.
如果我关闭日志,它会再次失败.把它重新打开,然后成功.这个开/关切换是通过app.config完成的,无需重新编译.
显然,记录行为会改变时间并使其起作用.这表明存在线程问题.但是,我的应用程序不是多线程的.
我已经看到一个MS KB条目表明.Net 2.0框架的错误可能会导致类似的问题(http://support.microsoft.com/kb/912732).但是,他们提供的修复程序无法解决此问题.