我有一个存储过程,可以在表中执行批量插入。我在 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/