hxw0 2020-02-15
锁升级(Lock Escalation)是指将当前锁的粒度降低。举个例子:数据库可以把一个表的1000个行锁升级为一个页锁,或者将页锁升级为表锁。
如果在数据库的设计中认为锁是一种稀有资源,而且想避免锁的开销,那数据库中会频繁出现锁升级现象。
SQL Server 数据库的设计认为锁是一种稀有的资源,在适合的时候会自动地将行、键或分页锁升级为更粗粒度地表级锁,这种升级保护了系统资源,防止系统使用太多地内存来维护锁,在一定程度上提高了效率。
即使在SQL Server 2005版本后,SQL Server数据库支持了行锁,但是其设计和InnoDB存储引擎完全不同,在以下情况下依然可能发生锁升级:
由一句单独的SQL语句在一个对象上持有的锁的数量超过了阀值,默认这个阀值为5000。值得注意的是,如果是不同对象,则不会发生锁升级;
锁资源占用的内存超过了激活内存的40%时就会发生锁升级;
InnoDB存储引擎不存在锁升级的问题。因为其不是根据每个记录来产生行锁的,相反,其根据每个事务访问的每个页对锁进行管理,采用的是位图的方式。因此不管一个事务锁住页中一个记录还是多个记录,其开销通常都是一致的。