批量INSERT时防止整个表锁定

时间:2011-09-30 15:54:42

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

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

我没有理解为什么SQL Server会锁定整个表,即使SELECT也是如此。

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

3 个答案:

答案 0 :(得分:5)

作家不应该阻止读者

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

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

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

  

<强> TABLOCK

     

指定在持续时间内获取表级锁定   批量进口操作。表可以同时加载   如果表没有索引并且指定了TABLOCK,则为多个客户端。   默认情况下,锁定行为由表选项table lock on bulk load确定。

有关详细信息,请参阅产品规格:Controlling Locking Behavior for Bulk Import

答案 1 :(得分:4)

您有一个打开的事务。这意味着SQL Server需要保留表的状态,并且您正在进行的任何更改都是“脏”且未提交。

如果来自当前正在使用开放(显式)事务更改的表中的SELECTSELECT将等到表处于稳定状态并且事务已提交或回滚。

要解决这个问题,you can alter the transaction isolation level on the SELECT query.

答案 2 :(得分:-1)

如果你在proc中指定TABLOCK,请不要。