我有一个存储过程,可以在表中执行批量插入。我在BEGIN TRANSACTION
查询上方添加了INSERT
命令,以便在出现问题时启用ROLL BACK
。批量插入启动时,它会锁定整个表,而其他用户无法在同一个表上执行SELECT
。
我没有理解为什么SQL Server会锁定整个表,即使SELECT
也是如此。
我正在使用SQL Server 2005 Express。这是这个版本的问题还是在2008年仍然存在?如何克服这种情况? 作家不应该阻止读者。
答案 0 :(得分:5)
作家不应该阻止读者
这仅适用于snapshot isolation,所有其他隔离级别都需要读取器阻止写入和写入块阻止读取器(不考虑脏读,因为它们是inconsistent并且永远不应该使用)。如果您需要此行为,请使用行版本控制(链接包含解决方案)。
为什么批量插入会锁定整个表?
这实际上可能是也可能不是。行为在您的控制之下:
<强> TABLOCK 强>
指定在持续时间内获取表级锁定 批量进口操作。表可以同时加载 如果表没有索引并且指定了TABLOCK,则为多个客户端。 默认情况下,锁定行为由表选项
table lock on bulk load
确定。
有关详细信息,请参阅产品规格:Controlling Locking Behavior for Bulk Import。
答案 1 :(得分:4)
您有一个打开的事务。这意味着SQL Server需要保留表的状态,并且您正在进行的任何更改都是“脏”且未提交。
如果来自当前正在使用开放(显式)事务更改的表中的SELECT
,SELECT
将等到表处于稳定状态并且事务已提交或回滚。
要解决这个问题,you can alter the transaction isolation level on the SELECT
query.
答案 2 :(得分:-1)
如果你在proc中指定TABLOCK,请不要。