【发布时间】:2009-03-04 17:51:25
【问题描述】:
我有一个应用程序,它可能对 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)。但是,他们提供的修复并没有解决这个问题。
【问题讨论】:
-
使用事务“以提高性能”?使用事务如何提高性能?
-
同意卢克,你为什么看到或认为这样做会提高性能?
-
围绕多个插入进行事务通常会提高性能,请自行测试并查看。通过进行事务,您可以减少在插入之前需要获取的锁数
-
你是否连续两次提交同一个事务?
-
您还可以减少事务的数量,否则每个语句都将是其自己的隐式事务。
标签: .net sql-server sql-server-2005 transactions