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

#1 楼

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

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

评论


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

–约瑟夫
08-10-15在20:15

我们现在做。叫T1211。

–约书亚
13年4月4日在16:17

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

–只是一个学习者
2015年5月5日在16:32

行锁不会升级为页面锁,而是直接升级为表锁。

– Manoj Pandey
16 Mar 17 '16 at 7:09

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

– NikolaD
18年11月21日在16:02

#2 楼

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

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

#3 楼

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


行锁始终会升级为表锁,和
页锁也升级为表锁。

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

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

锁升级阈值至少为5000个锁,并且取决于多个因素,MSDN BoL中已在此处提到了锁升级的详细说明:https:// technet.microsoft.com/zh-CN/library/ms184286(v=sql.105).aspx

评论


升级锁不会减少并发而不是增加并发吗?

– Binki
20年7月27日在18:18

#4 楼

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