面试题答案
一键面试锁升级可能出现的场景
- 大量小粒度锁竞争:
- 当数据库中对同一资源(如一张表)的并发访问非常高,并且事务在执行过程中需要频繁获取大量的行级锁时,容易出现锁升级。例如,在一个电商订单系统中,有大量用户同时下单,每个订单操作可能涉及对订单表的多行插入或更新操作,若每个操作都获取行级锁,随着并发量增大,数据库管理锁的开销会急剧增加。
- 长事务持有锁:
- 如果一个事务长时间持有大量的小粒度锁,而其他事务又频繁请求相关锁,数据库为了降低锁管理开销,可能会将小粒度锁升级为大粒度锁。比如,在一个财务系统中,一个复杂的财务结算事务,需要对多个账户表的多行数据进行更新操作,这个事务执行时间较长,在执行过程中一直持有行级锁,此时若有其他事务频繁请求这些行或表的锁,就可能触发锁升级。
对系统性能的影响举例
假设在一个银行转账系统中,有两个账户 A 和 B,要实现从 A 账户向 B 账户转账 100 元的操作。
- 正常行级锁情况(无锁升级):
- 事务 T1 执行转账操作,首先获取账户 A 行级锁,更新 A 账户余额(减少 100 元),然后获取账户 B 行级锁,更新 B 账户余额(增加 100 元),最后释放锁。如果并发量不是特别高,这种方式能有效保证数据一致性,并且锁的开销相对较小,系统性能可以维持在较好水平。
- 锁升级场景及性能影响:
- 当有大量并发转账操作时,每个事务都像 T1 一样获取行级锁,数据库锁管理开销剧增。此时数据库可能将行级锁升级为表级锁。比如事务 T2 在获取账户 A 的行级锁时,由于大量行级锁竞争,数据库将其升级为表级锁。这样一来,其他所有事务在操作该表(如其他转账事务对其他账户操作)时,都需要等待这个表级锁释放。原本可以并行执行的行级操作,因为锁升级为表级锁而变成串行执行,大大降低了系统的并发处理能力,导致系统性能大幅下降,响应时间变长,吞吐量降低。