我在一次面试中被问到这个问题,但没有得到回答。这里有人能解释一下吗?
发布于 2008-10-15 18:54:22
锁可以存在于行、页、分区或整个表和索引中。当事务正在进行时,事务所持有的锁占用资源。
锁升级是指系统将多个锁合并到一个更高级别的锁(例如,将多个行锁合并到一个分区或整个表中),通常用于恢复由大量细粒度锁占用的资源。
尽管您可以在表上设置标志(请参阅文档中的ALTER TABLE )以控制该表的锁升级策略,但它将自动完成此操作。
特别是,在Sybase和Server的旧版本中,当两个进程同时将单独的行写入同一页时,过早或过于急切的锁升级常常是一个问题。如果追溯到足够远的地方(IIRC SQL Server 6.5),Server没有行锁定,但只能锁定表或页。
在发生这种情况的地方,您可能会在同一页中的记录插入之间发生争用;通常,您会将聚集索引放在表上,以便将新插入转到不同的页面。
发布于 2008-10-15 18:52:12
这是一种减少系统开销的方法,方法是将许多细粒度锁转换为较少的粗粒度锁。更详细的信息可以找到这里和这里这里。
例如,如果表中的特定行上有许多锁(通常是数百个或更多),一旦超过允许的最大锁数,这些锁可能会被交换为整个表上的锁。
发布于 2016-03-17 07:20:59
Server通过将几个细粒度的低级别锁转换为粗粒度的高级别锁来进行锁定升级,以减少内存开销。
这是一个神话,行锁被升级为页锁。
如果一个表的行更新很少,SQL引擎将尝试在这些行上使用行锁,或者在这些页面上使用Pages。比方说它已经用了排锁。但是,如果行更新增加了阈值(~5k锁),那么它需要一个表锁,而不是几个行锁。因此,这通过释放几个行锁和使用一个表锁来减少内存开销,但增加了并发性。同样的情况发生在页面锁。
锁升级阈值至少是5000个锁,并且取决于几个因素,在MSDN BoL:https://technet.microsoft.com/en-us/library/ms184286(v=sql.105).aspx中已经提到了锁升级的详细解释。
https://dba.stackexchange.com/questions/12864
复制相似问题