面试题答案
一键面试死锁产生的可能原因
- 事务执行顺序不一致:不同事务以不同顺序访问相同的资源,例如事务A先锁定资源X,再锁定资源Y;而事务B先锁定资源Y,再锁定资源X,若两个事务同时进行,就可能形成死锁。
- 锁争用激烈:高并发场景下,大量事务同时请求相同资源的锁,导致锁竞争激烈,增加死锁出现概率。
- 长时间持有锁:事务在执行过程中长时间持有锁,不及时释放,其他事务等待时间过长,容易引发死锁。
- 锁粒度问题:如果锁粒度设置不当,例如过大的锁粒度会锁定过多不必要的资源,导致更多事务等待,增加死锁可能性;过小的锁粒度则可能增加锁管理开销并导致锁争用加剧。
优化预防方案
- 调整事务执行顺序
- 原理:让所有事务以相同顺序访问资源,避免形成循环等待的死锁条件。
- 优点:从根本上避免死锁,实现相对简单。
- 缺点:可能需要对业务逻辑进行较大调整,影响系统设计灵活性,且在复杂业务场景中确定统一顺序可能较困难。
- 减小锁粒度
- 原理:将大粒度的锁拆分为多个小粒度的锁,减少锁的范围,使事务等待资源的时间缩短,降低死锁概率。例如,在表级锁改为行级锁后,不同事务可同时访问表中不同行。
- 优点:提高并发性能,有效降低死锁可能性,对系统性能提升显著。
- 缺点:增加锁管理开销,因为锁数量增多,可能导致更多的上下文切换和内存开销,同时可能增加死锁检测和处理的复杂度。
- 设置合理的锁超时时间
- 原理:为事务获取锁设置一个超时时间,若在规定时间内未能获取到锁,则自动放弃并回滚事务,避免事务无限期等待锁而引发死锁。
- 优点:简单有效,能快速打破死锁局面,减少死锁对系统的影响,不需要对业务逻辑进行复杂调整。
- 缺点:超时时间设置较难,若设置过短,可能导致正常事务因偶尔的锁争用而频繁回滚;若设置过长,死锁发生后等待解除的时间也会变长,影响系统效率。
- 死锁检测与自动回滚
- 原理:数据库系统定期检查死锁情况,当检测到死锁时,自动选择一个代价最小的事务进行回滚,以打破死锁状态。MariaDB 有自己的死锁检测机制,通过分析事务等待图来发现死锁。
- 优点:对业务透明,无需开发人员手动处理死锁,数据库系统自动处理。
- 缺点:死锁检测本身有一定开销,会占用系统资源;且选择回滚事务时,若选择不当,可能影响业务执行效果,如回滚了重要事务,可能导致数据不一致或业务流程中断。
- 使用乐观锁
- 原理:乐观锁假设事务在执行过程中不会发生冲突,在更新数据时,通过版本号或时间戳等机制检查数据是否被其他事务修改。如果数据未被修改,则执行更新操作;否则,回滚事务并重新尝试。
- 优点:减少锁争用,提高并发性能,尤其适用于读多写少的场景,因为大部分读操作不需要获取锁,可直接进行。
- 缺点:不适用于写多读少的场景,频繁的写操作可能导致大量事务回滚;实现相对复杂,需要额外维护版本号或时间戳等机制,增加了开发和维护成本。