面试题答案
一键面试MySQL行锁持久性带来的问题
- 死锁:当两个或多个事务相互等待对方释放锁资源时,就会形成死锁。例如事务A持有行X的锁,想要获取行Y的锁;而事务B持有行Y的锁,想要获取行X的锁,这种循环等待就导致了死锁。
- 性能瓶颈:高并发下,大量事务竞争行锁,若行锁持有时间过长,会导致其他事务长时间等待,降低系统整体吞吐量。例如复杂业务逻辑的事务长时间持有锁,后续事务排队等待,造成性能瓶颈。
优化策略
- 合理设计事务:
- 思路:将大事务拆分成小事务,减少锁的持有时间。例如原本一个涉及多个表更新的大事务,拆分成多个独立小事务,每个小事务只处理一个表的操作。
- 涉及机制:无特定MySQL配置,需要开发人员在代码层面优化事务逻辑。
- 优化SQL语句:
- 思路:确保SQL语句使用索引,避免全表扫描。例如查询条件使用索引字段,可快速定位到需要加锁的行,减少锁范围。
- 涉及机制:通过
CREATE INDEX
语句创建合适的索引。
- 设置合理的死锁检测和超时机制:
- 思路:开启死锁检测,MySQL会自动检测到死锁并回滚其中一个事务,避免无限等待。同时设置合理的锁等待超时时间,防止事务长时间等待锁资源。
- 涉及配置:
innodb_deadlock_detect
参数开启死锁检测(默认开启),innodb_lock_wait_timeout
参数设置锁等待超时时间(默认50秒)。
- 调整事务隔离级别:
- 思路:在满足业务需求的前提下,降低事务隔离级别。例如从
SERIALIZABLE
降低到READ COMMITTED
,减少锁的竞争。 - 涉及配置:通过
SET SESSION TRANSACTION ISOLATION LEVEL
语句设置事务隔离级别。
- 思路:在满足业务需求的前提下,降低事务隔离级别。例如从