MST

星途 面试题库

面试题:MySQL中锁升级在什么场景下容易发生?

请描述MySQL中锁升级可能出现的场景,并举例说明在这种场景下锁升级是如何对系统性能产生影响的。
30.7万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

锁升级可能出现的场景

  1. 大量小粒度锁竞争
    • 当数据库中对同一资源(如一张表)的并发访问非常高,并且事务在执行过程中需要频繁获取大量的行级锁时,容易出现锁升级。例如,在一个电商订单系统中,有大量用户同时下单,每个订单操作可能涉及对订单表的多行插入或更新操作,若每个操作都获取行级锁,随着并发量增大,数据库管理锁的开销会急剧增加。
  2. 长事务持有锁
    • 如果一个事务长时间持有大量的小粒度锁,而其他事务又频繁请求相关锁,数据库为了降低锁管理开销,可能会将小粒度锁升级为大粒度锁。比如,在一个财务系统中,一个复杂的财务结算事务,需要对多个账户表的多行数据进行更新操作,这个事务执行时间较长,在执行过程中一直持有行级锁,此时若有其他事务频繁请求这些行或表的锁,就可能触发锁升级。

对系统性能的影响举例

假设在一个银行转账系统中,有两个账户 A 和 B,要实现从 A 账户向 B 账户转账 100 元的操作。

  1. 正常行级锁情况(无锁升级)
    • 事务 T1 执行转账操作,首先获取账户 A 行级锁,更新 A 账户余额(减少 100 元),然后获取账户 B 行级锁,更新 B 账户余额(增加 100 元),最后释放锁。如果并发量不是特别高,这种方式能有效保证数据一致性,并且锁的开销相对较小,系统性能可以维持在较好水平。
  2. 锁升级场景及性能影响
    • 当有大量并发转账操作时,每个事务都像 T1 一样获取行级锁,数据库锁管理开销剧增。此时数据库可能将行级锁升级为表级锁。比如事务 T2 在获取账户 A 的行级锁时,由于大量行级锁竞争,数据库将其升级为表级锁。这样一来,其他所有事务在操作该表(如其他转账事务对其他账户操作)时,都需要等待这个表级锁释放。原本可以并行执行的行级操作,因为锁升级为表级锁而变成串行执行,大大降低了系统的并发处理能力,导致系统性能大幅下降,响应时间变长,吞吐量降低。