SQL Server数据库可以在事务期间应答吗?

时间:2009-11-27 18:08:16

标签: .net sql-server sql-server-2005 ado.net transactions

我正在使用.Net 2.0,ADO.NET,数据集和数据适配器来管理我的数据,以及Microsoft SQL Server 2005作为数据库管理器。

我有一个应用程序可以生成大量结果(500K +)并将它们保存在数据库中。如果一个结果生成失败,我想不保存任何结果。因此,如果无法生成结果,我会将所有数据库插入放在一个回滚的事务中。

然而,表被锁定,直到写完所有结果,这不是我想要的。或者至少我猜它被锁定,没有SELECT查询响应,直到插入结束。

有没有办法让事务在事务处于活动状态时不锁定表?

使用包含这么多插入的事务是否是一个好主意?

2 个答案:

答案 0 :(得分:2)

您可能需要考虑将事务拆分为较小的批次,每隔1k左右提交一次。

您可以通过在select语句中指定 WITH(NOLOCK)提示(将其放在表名后面)来超越锁定,但要非常小心,因为它会读取没有的数据已经提交(即可以回滚的东西)。还有 WITH(ROWLOCK)提示可以与您的插入一起使用,这可能会降低锁定选择的机会(如果您尝试访问已插入的行,仍会发生锁定通过未提交的事务,但SQL不会取消整个表上的锁,因此不太可能。)

您可以找到有关表提示here的更多信息,只需要非常小心,因为它们会影响性能。希望它有所帮助。

答案 1 :(得分:2)

您可以使用临时登台表。按你的步伐填写。然后使用一个SELECT INTO执行最终移动作为单个事务。完成大动作后,删除临时表。

如果对整体完整性有一些更强的限制,您可以引入更多的轻量级表,反映数据流阶段的表,日志/日志表。一些恢复/补偿/清理程序等