面试题答案
一键面试容易触发锁升级的业务场景及数据库操作
- 大量小事务操作同一资源:当多个小事务频繁地对相同的数据库行、表或其他资源进行读写操作时,为了保证数据一致性,数据库会先使用粒度较小的锁(如行级锁)。但随着事务数量增多,管理这些细粒度锁的开销会增大,可能触发锁升级为粒度更大的锁(如表级锁)。例如在高并发的电商库存系统中,众多用户同时下单购买同一商品,每个下单操作可视为一个小事务,都对库存表中的同一行数据(该商品库存记录)进行更新操作。
- 长事务占用资源:长事务长时间持有锁,并且在事务执行过程中不断访问和修改大量数据。在其执行期间,新的事务可能因为无法获取所需锁而等待。当等待队列中的事务数量达到一定阈值,数据库可能将锁升级,以减少锁管理的复杂性。比如在财务系统中,一个复杂的财务核算事务,需要遍历和更新多个财务报表的大量数据行,执行时间较长。
- 批量操作:进行批量插入、更新或删除操作时,如果操作涉及大量数据,数据库可能一开始使用行级锁,但随着操作的进行,为了提高效率或者由于锁竞争过于激烈,可能将锁升级为表级锁。例如在数据迁移任务中,将大量历史订单数据从一个表迁移到另一个表,执行批量插入操作。
锁升级对数据库性能和并发操作的影响
- 性能影响
- 降低并发性能:锁升级后,锁的粒度变大,意味着更多的事务会因为锁冲突而等待。原本可以并发执行的事务,由于表级锁的存在,只能串行执行,从而降低了系统的并发处理能力,导致整体性能下降。例如,在上述电商库存系统中,若锁升级为表级锁,所有涉及库存操作的事务都需排队等待,订单处理速度大幅减慢。
- 增加锁开销:虽然锁升级减少了锁的数量,一定程度上降低了锁管理的部分开销,但由于大粒度锁会阻塞更多事务,这些事务等待期间占用的系统资源(如内存、CPU 等)以及重新调度事务的开销可能更大,整体上可能增加系统的负担。
- 并发操作影响
- 增加死锁风险:锁升级使锁的竞争更加集中,不同事务获取锁的顺序可能变得更加复杂。当多个事务以不同顺序获取和等待锁时,更容易形成死锁。例如,事务 A 获取了表级锁并等待其他资源,事务 B 获取了部分行级锁并等待表级锁,若锁升级后事务 B 等待的表级锁被事务 A 持有,就可能产生死锁。
- 公平性问题:大粒度锁可能导致一些小事务长时间等待,而一些持有大粒度锁的大事务长时间占用资源,影响了并发操作的公平性,可能使得一些需要快速响应的小业务请求得不到及时处理。