MySQL锁(锁升级)

Posted gaohuan30

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL锁(锁升级)相关的知识,希望对你有一定的参考价值。

  锁升级(Lock Escalation)是指将当前锁的粒度降低。举个例子:数据库可以把一个表的1000个行锁升级为一个页锁,或者将页锁升级为表锁。

  如果在数据库的设计中认为锁是一种稀有资源,而且想避免锁的开销,那数据库中会频繁出现锁升级现象。

  SQL Server 数据库的设计认为锁是一种稀有的资源,在适合的时候会自动地将行、键或分页锁升级为更粗粒度地表级锁,这种升级保护了系统资源,防止系统使用太多地内存来维护锁,在一定程度上提高了效率。

  即使在SQL Server 2005版本后,SQL Server数据库支持了行锁,但是其设计和InnoDB存储引擎完全不同,在以下情况下依然可能发生锁升级:

    由一句单独的SQL语句在一个对象上持有的锁的数量超过了阀值,默认这个阀值为5000。值得注意的是,如果是不同对象,则不会发生锁升级;

    锁资源占用的内存超过了激活内存的40%时就会发生锁升级;

  InnoDB存储引擎不存在锁升级的问题。因为其不是根据每个记录来产生行锁的,相反,其根据每个事务访问的每个页对锁进行管理,采用的是位图的方式。因此不管一个事务锁住页中一个记录还是多个记录,其开销通常都是一致的。

以上是关于MySQL锁(锁升级)的主要内容,如果未能解决你的问题,请参考以下文章

将共享锁升级为独占锁时避免 MySQL 死锁

MySQL——innodb锁

MySQL高级——锁与事务

MySQL高级——锁与事务

MySQL中的锁

MySQL锁<一>