问题表达:
我正在尝试一些有关交易的事情。请考虑以下操作:
BEGIN
一个事务,然后从表A中删除大约2000行数据然后,我重复相同的操作,但是在STEP 2中,我删除了1万行数据,在这种情况下,STEP 4无法成功运行。我已经等了半个小时了。
它表明它正在执行SQL ...无法完成。最后,我使用连接窗口1插入数据,它现在可以正常工作。
为什么它可以处理2k行而不是1万行?
我执行的Sql语句:
在连接窗口A中,我执行 开始TRAN 从表A中删除(1万行)
在连接窗口B中,我执行 插入tableA(..)值(...)
Windows B无法成功执行。
非常感谢@Gordon
原因:
我搜索有关锁升级的关键字。 我尝试使用SQL Server Profiler跟踪锁定升级,并且得到 lock:在删除事务中的许多数据时升级(我不提交或不回滚)。
因此,我知道锁升级的概念。 我删除了表中太多的数据,然后该行将升级锁定为表升级。我没有提交或回滚它们,其他连接(或应用程序) 无法使用表锁访问表。 trace lock escalation in sql profiler
在MSSQL Server中发生锁升级
“ locks选项还会影响何时发生锁升级。当锁设置为0时,当当前锁结构使用的内存达到数据库引擎内存池的40%时,就会发生锁升级。当锁未设置为0时,当锁的数量达到为锁指定的值的40%时,就会发生锁升级。”
如何设置使用SQL Server Management Studio来影响锁升级:
配置锁选项 在对象资源管理器中,右键单击服务器,然后选择“属性”。
单击“高级”节点。
在Parallelism下,为locks选项输入所需的值。
使用locks选项设置最大可用锁数,例如限制SQL Server用于它们的内存量。
答案 0 :(得分:3)
您遇到的是“锁定升级”。默认情况下,SQL Server使用(我认为)行级锁进行删除。但是,如果表达式的阈值超过某个值(5,000个锁),则SQL Server会将锁升级为整个表。
这是一种自动机制,您可以根据需要将其关闭。
在SQL Server文档和相关文档中都有很多与此相关的信息。