采访中有人问我这个问题,但没有答案。这里有人可以解释吗?
采访中有人问我这个问题,但没有答案。这里有人可以解释吗?
Answers:
数据库锁可以存在于行,页或整个表或索引上。进行交易时,交易持有的锁占用资源。锁升级是系统将多个锁合并到一个较高级别的锁(例如,将多个行锁合并到一个页面或将多个页合并到整个表),通常是为了恢复大量细粒度锁占用的资源。
尽管您可以在表上设置标志(请参见在线书籍中的ALTER TABLE)以控制该特定表上的锁升级策略,但它将自动执行此操作。特别是,当您有两个进程同时将不同的行同时写入同一页时,过早或过于急切的锁升级在Sybase和SQL Server的较早版本上便成为问题。如果返回足够远(IIRC SQL Server 6.5),SQL Server实际上没有行锁定,而只能锁定表或页面。在这种情况下,您可能会在同一页的记录插入之间引起争用;通常,您会在表上放置聚簇索引,以便新插入内容进入不同的页面。
SQL Server 通过将几个细粒度的低级锁转换为粗粒度的高级锁来进行锁升级,以减少内存开销。
将行锁升级为页面锁是一个神话, @ConcernedOfTunbridgeWells上面提到的错误是错误的。
如果表的行更新很少,则SQL引擎将尝试获取这些行上的行锁或这些页面上的页锁。假设它采用了行锁定。但是,如果行更新增加了阈值(〜5k锁),则将采用单个表锁,而不是采用多个行锁。因此,这通过释放多个行锁并采用单个表锁来减少内存开销,但增加了并发性。页面锁也会发生同样的情况。
该锁升级阈值是-至少5000个锁,并取决于几个因素,锁升级的详细说明已经在MSDN BOL这里提到:https://technet.microsoft.com/en-us/library/ms184286(v = sql.105).aspx