什么是锁升级?

52 sql-server lock-escalation locking

我在面试中被问到这个问题,但没有答案。这里有人能解释一下吗?

Con*_*lls 47

DB 锁可以存在于行、页或整个表或索引上。当事务在进行中时,事务持有的锁会占用资源。锁升级是系统将多个锁合并为更高级别的锁(例如,将多个行锁合并到一个页面或将多个页面合并到整个表),通常是为了恢复被大量细粒度锁占用的资源。

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

  • 行锁不升级为页锁,而是直接升级为表锁。 (11认同)
  • 还应该注意的是,我们无法控制服务器何时升级。 (3认同)

小智 21

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

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


Man*_*dey 13

SQL Server 执行Lock Escalation减少内存开销,方法是将几个细粒度的低级锁转换为粗粒度的高级锁。

  • 行锁总是升级为表锁,并且
  • 页锁也升级为表锁。

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

如果表的行更新很少,SQL 引擎将尝试在这些行上使用 Row-Locks 或在这些 Pages 上使用 Page-Lock。假设它采用了 Row-Lock。但是如果行更新增加了阈值(约 5k 个锁),那么它不需要多个行锁,而是需要一个表锁。因此,这通过释放多个 Row-Locks 和获取单个 Table-Lock 来减少内存开销,但增加了并发性。页面锁定也会发生同样的情况。

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

  • 升级锁不是会减少并发而不是增加并发吗? (4认同)

小智 5

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