批量INSERT时防止整个表锁定

RKh*_*RKh 2 sql-server sql-server-2005 sql-server-2008

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

我不是在跟踪为什么SQL Server会锁定整个表SELECT.

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

JNK*_*JNK 5

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

如果您SELECT使用当前正在使用打开(显式)事务更改的表,则将SELECT等到该表处于稳定状态并且事务已提交或回滚。

为了解决这个问题,您可以更改查询的事务隔离级别SELECT


Rem*_*anu 5

作家不应该阻止读者

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

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

这实际上可能是也可能不是.这种行为在你的控制之下:

TABLOCK

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

有关更多详细信息,请阅读产品规范:控制批量导入的锁定行为.