什么是锁升级?


47

采访中有人问我这个问题,但没有答案。这里有人可以解释吗?

Answers:


45

数据库锁可以存在于行,页或整个表或索引上。进行交易时,交易持有的锁占用资源。锁升级是系统将多个锁合并到一个较高级别的锁(例如,将多个行锁合并到一个页面或将多个页合并到整个表),通常是为了恢复大量细粒度锁占用的资源。

尽管您可以在表上设置标志(请参见在线书籍中的ALTER TABLE)以控制该特定表上的锁升级策略,但它将自动执行此操作。特别是,当您有两个进程同时将不同的行同时写入同一页时,过早或过于急切的锁升级在Sybase和SQL Server的较早版本上便成为问题。如果返回足够远(IIRC SQL Server 6.5),SQL Server实际上没有行锁定,而只能锁定表或页面。在这种情况下,您可能会在同一页的记录插入之间引起争用;通常,您会在表上放置聚簇索引,以便新插入内容进入不同的页面。


3
还应注意,我们无法控制服务器何时升级。

我们现在做。叫T1211。
约书亚

@Joshua,跟踪标志1211用于禁用锁升级。我们无法告诉SQL Server在特定时间进行升级。
只是一个学习者

10
行锁不升级为页面锁,而是直接升级为表锁。
Manoj Pandey

玛诺伊说的是真的。您应该更正答案中的该部分,以避免误导经验不足的SQL Server用户
NikolaD

20

通过将许多细粒度的锁转换为较少的粗粒度的锁,这是一种减少系统开销的方法。更详细的信息可以在这里这里找到。

例如,如果您在表的特定行上具有许多(通常是数百个或更多)锁,则一旦超出最大允许锁数量,这些锁可能会交换为整个表上的锁。


11

SQL Server 通过将几个细粒度的低级锁转换为粗粒度的高级锁来进行锁升级,以减少内存开销

  • 行锁始终升级为表锁,并且
  • 页面锁也将升级为表锁。

将行锁升级为页面锁是一个神话, @ConcernedOfTunbridgeWells上面提到的错误是错误的。

如果表的行更新很少,则SQL引擎将尝试获取这些行上的行锁或这些页面上的页锁。假设它采用了行锁定。但是,如果行更新增加了阈值(〜5k锁),则将采用单个表锁,而不是采用多个行锁。因此,这通过释放多个行锁并采用单个表锁来减少内存开销,但增加了并发性。页面锁也会发生同样的情况。

锁升级阈值是-至少5000个锁,并取决于几个因素,锁升级的详细说明已经在MSDN BOL这里提到:https://technet.microsoft.com/en-us/library/ms184286(v = sql.105).aspx


5

锁升级意味着将锁转换为更严格的模式。这在数据库中最常见。查询可能具有锁定为“共享”的资源,并将其升级为“独占”以执行更新。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.