sql-server - 防止批量插入时锁定整个表

标签 sql-server sql-server-2005 sql-server-2008

我有一个存储过程,可以在表中执行批量插入。我在 INSERT 查询上方添加了 BEGIN TRANSACTION 命令,以便在出现问题时启用 ROLL BACK。当批量插入启动时,它锁定了整个表,其他用户无法在同一个表上执行 SELECT

我不明白为什么 SQL Server 甚至会为 SELECT 锁定整个表。

我正在使用 SQL Server 2005 Express。这是这个版本的问题还是2008年也存在这个问题?如何克服这种情况呢? 作者不应阻止读者

最佳答案

作者不应阻止读者

这仅适用于 snapshot isolation ,所有其他隔离级别都要求读取器阻止写入,写入器阻止读取器(不考虑脏读,因为它们是 inconsistent 并且永远不应该使用)。如果您需要此行为,请使用行版本控制(链接包含解决方案)。

为什么批量插入会锁定整个表?

这实际上可能是真的,也可能不是真的。该行为在您的控制之下:

TABLOCK

Specifies that a table-level lock is acquired for the duration of the bulk-import operation. A table can be loaded concurrently by multiple clients if the table has no indexes and TABLOCK is specified. By default, locking behavior is determined by the table option table lock on bulk load.

了解更多详情,请阅读产品规范:Controlling Locking Behavior for Bulk Import .

关于sql-server - 防止批量插入时锁定整个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7612971/

相关文章:

sql-server-2008 - 对 SQL Server 中的名称字段进行部分匹配

sql-server - sql查询解决以下问题

sql-server - 使用sqoop从配置单元导出到sql服务器

sql-server-2005 - 使用服务器复制和客户端复制配置 SQL Server 2005

sql - 将所有 0 值设置为 NULL

sql-server - TFS 2013 中的报告

sql-server-2008 - SQL 添加一周的总和行并在末尾添加总计

sql - STRING_AGG 未按预期运行

sql-server - T-SQL Json_modify 将属性附加到每个对象

SQL View - 如果为空,则添加默认值?