RKh*_*RKh 2 sql-server sql-server-2005 sql-server-2008
我有一个存储过程在表中执行批量插入.我BEGIN TRANSACTION
在INSERT
查询上方添加了命令,以便ROLL BACK
在出现问题时启用.批量插入启动时,它会锁定整个表,而其他用户无法SELECT
在同一个表上执行.
我不是在跟踪为什么SQL Server会锁定整个表SELECT
.
我正在使用SQL Server 2005 Express.这是这个版本的问题还是在2008年仍然存在?如何克服这种情况?作家不应该阻止读者.
您有一笔未结交易。 这意味着 SQL Server 需要保留表的状态,并且您正在进行的任何更改都是“脏”且未提交的。
如果您SELECT
使用当前正在使用打开(显式)事务更改的表,则将SELECT
等到该表处于稳定状态并且事务已提交或回滚。
为了解决这个问题,您可以更改查询的事务隔离级别SELECT
。
作家不应该阻止读者
这仅适用于快照隔离,所有其他隔离级别都需要读取器阻止写入和写入阻止读取器(不考虑脏读,因为它们不一致且永远不应使用).如果您需要此行为,请使用行版本控制(该链接包含解决方案).
为什么批量插入锁定整个表?
这实际上可能是也可能不是.这种行为在你的控制之下:
TABLOCK
指定在批量导入操作期间获取表级锁定.如果表没有索引并且指定了TABLOCK,则表可以由多个客户端同时加载.默认情况下,锁定行为由表选项确定
table lock on bulk load
.
有关更多详细信息,请阅读产品规范:控制批量导入的锁定行为.
归档时间: |
|
查看次数: |
12140 次 |
最近记录: |