一尘不染

锁升级-这是怎么回事?

sql

在SQL Server 2008中更改表(删除列)时,我单击了Generate Change Script按钮,我注意到它生成的更改脚本会删除该列,说“
go”,然后运行一个似乎要设置的附加ALTER TABLE语句表的锁定升级为“ TABLE”。例子:

ALTER TABLE dbo.Contract SET (LOCK_ESCALATION = TABLE)

我还应该注意,这是更改脚本要做的最后一件事。它在做什么,为什么将LOCK_ESCALATION设置为TABLE?


阅读 137

收藏
2021-03-17

共1个答案

一尘不染

锁定升级”是SQL处理大型更新锁定的方式。当SQL要更改很多行时,数据库引擎采用较少的较大的锁(例如整个表)而不是锁定许多较小的内容(例如行锁)会更有效率。

但是,当您有一个巨大的表时,这可能会带来问题,因为对整个表进行锁定可能会长时间锁定其他查询。这是一个权衡:许多小粒度锁比少数(或一个)粗粒度锁要慢,并且有多个查询锁定表的不同部分会在一个进程正在等待另一个进程的情况下造成死锁的可能性。

LOCK_ESCALATIONSQL 2008中有一个表级选项,它可以控制锁升级。默认值“
TABLE”允许锁一直升级到表级别。在大多数情况下,DISABLE可以防止将锁升级到整个表。AUTO允许表锁,除非表已分区(在这种情况下,锁仅由分区级别组成)。有关更多信息,请参见此博客文章

我怀疑IDE在重新创建表时会添加此设置,因为TABLE是SQL 2008中的默认设置。请注意,SQL
2005不支持LOCK_ESCALATION,因此,如果尝试在Windows 2000上运行脚本,则需要删除它。
2005年实例。另外,由于TABLE是默认值,因此您可以在重新运行脚本时安全地删除该行。

还要注意,在存在此设置的SQL 2005中,所有锁都可以升级到表级别-换句话说,“ TABLE”是SQL 2005上的唯一设置。

2021-03-17