我有一个可能会对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()
为了找出原因,我在每个事务操作中都放置了跟踪语句,以便可以确保在调用commit之前未关闭事务。我已确认我的应用程序无法完成交易。
然后,我使用完全相同的输入数据再次运行该应用程序,并且成功。
如果我关闭日志记录,它将再次失败。重新打开它,它会成功。此开/关切换是通过app.config完成的,无需重新编译。
显然,日志记录的行为会更改计时并使其起作用。这将指示线程问题。但是,我的应用程序不是多线程的。
我已经看到一个MS KB条目,该条目指示.Net 2.0框架的错误可能导致类似的问题(http://support.microsoft.com/kb/912732)。但是,他们提供的修复程序不能解决此问题。
最佳答案
感谢您的所有反馈。我一直在MSDN论坛上与来自MSFT的人员合作,以了解发生了什么情况。事实证明,该问题是由于日期时间转换问题导致插入之一失败而导致的。
主要问题在于,如果是日期转换错误,则会显示此错误。但是,如果是另一个错误(例如字段太长),则不会导致此问题。在这两种情况下,我都希望事务仍然存在,因此可以对其调用回滚。
我有完整的示例程序来复制此问题。如果有人希望看到它或与MSFT进行交流,则可以在SqlTransaction.ZombieCheck错误线程下的microsoft.public.dotnet.framework.adonet中的MSFT新闻组上找到该线程。