面试题答案
一键面试不同事务隔离级别和锁机制组合下的性能瓶颈
- 读未提交(Read Uncommitted)
- 性能瓶颈:可能出现脏读,即一个事务读取到另一个未提交事务的数据。虽然锁机制简单,读操作基本无锁,并发性能看似较高,但因数据的不确定性,可能导致后续业务逻辑出错,增加系统维护成本。
- 锁机制:读操作基本不使用锁,写操作使用排他锁(X锁)。
- 读已提交(Read Committed)
- 性能瓶颈:会出现不可重复读问题,同一事务内多次读取同一数据,可能因其他事务提交修改而得到不同结果。读操作需获取共享锁(S锁),写操作获取排他锁(X锁),锁竞争相对频繁,影响并发性能。
- 锁机制:读操作获取共享锁(S锁),读完即释放;写操作获取排他锁(X锁)。
- 可重复读(Repeatable Read)
- 性能瓶颈:MySQL默认级别,解决了不可重复读,但可能出现幻读。在高并发写入场景下,为防止幻读,会使用间隙锁(Gap Lock),这大大增加了锁的范围,导致锁竞争加剧,性能下降。
- 锁机制:除共享锁(S锁)和排他锁(X锁),还引入间隙锁(Gap Lock),防止在同一范围内插入新数据。
- 串行化(Serializable)
- 性能瓶颈:最高隔离级别,通过完全串行化事务执行来避免所有并发问题。但这意味着所有事务排队执行,并发性能极低,严重影响系统吞吐量。
- 锁机制:读操作使用共享锁(S锁),写操作使用排他锁(X锁),且在事务结束前不会释放锁。
优化策略
- 读未提交
- 策略:在业务场景允许脏读且对数据一致性要求不高时,可适当使用此隔离级别以提高并发性能。但要确保业务逻辑能处理可能出现的脏数据情况。
- 权衡:牺牲数据一致性,换取高并发处理能力。
- 读已提交
- 策略:
- 合理设计索引,减少锁争用范围。索引能让MySQL更精准定位数据,减少锁的数量和范围。
- 优化事务大小,将大事务拆分成小事务,缩短锁的持有时间。
- 权衡:在保证一定数据一致性(避免脏读)的前提下,通过优化锁争用提高并发处理能力。
- 策略:
- 可重复读
- 策略:
- 优化索引,减少间隙锁范围。精准的索引能减少间隙锁锁住的区间。
- 合理安排事务顺序,避免死锁。按一定顺序访问数据,可降低死锁风险。
- 对于只读事务,可设置为快照读,避免锁竞争。
- 权衡:在保证数据一致性(解决不可重复读)的基础上,通过减少锁争用提升并发处理能力,但仍需在一定程度上牺牲性能来保证数据一致性。
- 策略:
- 串行化
- 策略:仅在对数据一致性要求极高,且并发量不大的场景使用。如银行转账等关键业务。
- 权衡:以极低的并发处理能力换取最高的数据一致性。