
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
数据库架构技术是许多后端开发程序员都需要掌握的一个编程技术,而今天我们就一起来了解一下,数据库开发死锁问题的产生与解决方法。
仔细设计SQL,避免间隙锁加在较大的区间。较大的区间意味着更高的并发写入概率,从而会提高死锁发生的概率。
例如,将SQL改写为INSERTINTO...ONDUPLICATEKEYUPDATE....如果没有对应的数据,不同行的插入,插入意向锁不会相互阻塞;如果有重复主键数据,则UPDATE操作属于索引上的等值查询,此时间隙锁退化为行锁。
优化业务流程,降低事务的总执行时间。通过降低事务的执行时间,降低了事务之间并发的可能性,从而一定程度上降低死锁发生的概率。
例如,在设计数据结构和业务流程时,避免在一个长事务中操作多张表。
又例如,避免再事务当中引入其他网络调用操作,因为网络调用的时间通常会远高于本地调用。
如果可能,适当降低隔离级别。InnoDB默认隔离级别为REPEATABLEREAD,在某些高查询低写入、业务流程相对简单或者容忍幻读的应用场景中,可以将隔离级别设置为READCOMMITTED,这不但能够在一定程度上降低死锁发生的概率,还能有效提升数据库能够提供的并发能力。
例如,将数据库的隔离级别设置为READCOMMITTED则不会发生死锁。
对于SELECT...LOCKINSHAREMODE和SELECT...FORUPDATE,如果查询读取的记录为单行,也可以降低事务隔离级别至READCOMMITTED。此时已通过命令显式加锁,无需更高的隔离级别。
对于上面两条建议,需要注意:
当将隔离级别设置为READCOMMITTED时,意味着容忍幻读的发生,此时间隙锁不生效,并发会话可能插入并不存在的数据,导致前后读取的记录数不一致。
仔细设计表的索引。通过良好设计的索引降低事务扫描的记录数,从而降低死锁的概率。
对于可能发生的死锁,还需要设计重试机制。万一产生死锁,通过重试机制确保数据可以终写入成功。
希望这辈子,最让你无悔的事情就是来达内学习!学习向来不是件易事,但无论过程多么艰难,希望你依然热爱生活,热爱学习!永远记得,达内将与你一同前行!现在扫码,立即领取万元课程礼包,助力0基础快速入行,为你梳理行业必备技能,全方位了解岗位发展前景!
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。