问题表达式:
我正在尝试一些关于交易的东西。考虑以下行动:
BEGIN事务,然后从表A中删除大约2000行数据然后,重复相同的操作,但在步骤2中,我删除10k行数据,在这种情况下,步骤4无法成功运行。我已经等了半个小时了。
它显示它正在执行SQL.无法完成。最后,我使用连接窗口1插入数据,它现在正在工作。
为什么它适用于2k行,而不是10k行?
我执行的Sql语句:
在连接窗口A中,我从tableA执行(10K行)
在连接窗口B中,我执行插入到tableA(..)价值(.)
windows B无法成功执行。
非常感谢@Gordon
的事业
我搜索关于锁升级的关键字。我尝试使用跟踪锁升级,当我删除事务中的许多数据(我不提交或回滚)时,我得到一个锁:升级。
所以,我知道锁升级的概念。我删除表中的数据太多,那么行锁升级到表升级,我没有提交或回滚它们,其他连接(或应用程序)无法使用表锁访问表。sql探查器中的跟踪锁升级
当锁升级发生在MSSQL 中时,
“锁选项还会影响锁升级发生的时间。当锁设置为0时,当当前锁结构使用的内存达到数据库引擎内存池的40 %时,锁升级就会发生。当锁没有设置为0时,当锁的数量达到为锁指定的值的40 %时,锁升级就会发生。”
如何使用设置将影响锁升级的:
要在对象资源管理器中配置锁选项,请右击服务器并选择“属性”。
单击“高级”节点。
在并行性下,键入锁选项所需的值。
使用locks选项设置可用锁的最大数量,从而限制Server对其使用的内存数量。
发布于 2019-10-05 17:28:43
你正在经历的是“锁定升级”。默认情况下,Server为delete使用(我认为)行级锁。但是,如果表达式的阈值超过5,000个锁,则Server将锁定升级到整个表。
这是一个自动机制,你可以关掉它,如果你需要的话。
在SQL Server文档和相关文档中都有关于这方面的许多信息。
https://stackoverflow.com/questions/58250674
复制相似问题