欢迎关注微信公众号:互联网全栈架构

死锁是指两个或者多个事务互相持有对方所需的资源,从而导致它们都无法继续执行的情况。下图是一个死锁的示例,事务1锁住了id=1的数据(比如更新id=1的数据记录),同时请求锁住id=2的数据,但事务2持有id=2的锁,同时又请求id=1的锁,这样就造成了相互等待对方释放锁的情况,从而产生了死锁:

上图是死锁产生的示例说明,我们用实际的SQL来演示死锁的产生,首先创建一个测试表,它只有两个字段,id和数量,id为自增类型,然后向表中插入两条数据:

------------------------LATESTDETECTEDDEADLOCK------------------------2023-11-0815:57:230x4df8***(1)TRANSACTION:TRANSACTION350231,ACTIVE12secstartingindexreadmysqltablesinuse1,locked1LOCKWAIT3lockstruct(s),heapsize1136,2rowlock(s),undologentries1MySQLthreadid3,OSthreadhandle19044,queryid339localhost::1rootupdatingUPDATEt_testSETquantity=102WHEREid=2***(1)WAITINGFORTHISLOCKTOBEGRANTED:RECORDLOCKSspaceid743pageno3nbits72indexPRIMARYoftable`test`.`t_test`trxid350231lock_modeXlocksrecbutnotgapwaitingRecordlock,heapno3PHYSICALRECORD:n_fields4;compactformat;infobits00:len4;hex80000002;asc;;1:len6;hex000000055818;ascX;;2:len7;hex2f000001401cb2;asc/@;;3:len4;hex800000c9;asc;;***(2)TRANSACTION:TRANSACTION350232,ACTIVE10secstartingindexread,threaddeclaredinsideInnoDB5000mysqltablesinuse1,locked13lockstruct(s),heapsize1136,2rowlock(s),undologentries1MySQLthreadid5,OSthreadhandle19960,queryid340localhost127.0.0.1rootupdatingUPDATEt_testSETquantity=202WHEREid=1***(2)HOLDSTHELOCK(S):RECORDLOCKSspaceid743pageno3nbits72indexPRIMARYoftable`test`.`t_test`trxid350232lock_modeXlocksrecbutnotgapRecordlock,heapno3PHYSICALRECORD:n_fields4;compactformat;infobits00:len4;hex80000002;asc;;1:len6;hex000000055818;ascX;;2:len7;hex2f000001401cb2;asc/@;;3:len4;hex800000c9;asc;;***(2)WAITINGFORTHISLOCKTOBEGRANTED:RECORDLOCKSspaceid743pageno3nbits72indexPRIMARYoftable`test`.`t_test`trxid350232lock_modeXlocksrecbutnotgapwaitingRecordlock,heapno2PHYSICALRECORD:n_fields4;compactformat;infobits00:len4;hex80000001;asc;;1:len6;hex000000055817;ascX;;2:len7;hex2e0000018d1edf;asc.;;3:len4;hex80000065;asce;;***WEROLLBACKTRANSACTION(2)
从上面可以看出,MySQL可以检测到死锁,并通过回滚事务的方式来打破这种循环等待,但无论如何,在代码中还是需要尽量减少或者避免死锁的发生,可以尝试通过以下方法来达到这样的目的:
    • 让事务尽可能的小且短;
    • 合理设置事务隔离级别;
    • 合理设置锁等待超时时间;
    • 确定好事务操作的顺序;
    • 创建合适的索引,减少加锁的情况。

以上就是关于MySQL中的死锁介绍。在实际编码中,死锁也是较为常见的一种错误,如果对于它不了解,那么碰到这种异常的时候就会显得手足无措,希望本文有所帮助。
都看到这里了,请帮忙一键三连啊,也就是点击文末的在看、点赞、分享,这样会让我的文章让更多人看到,也会大大地激励我进行更多的输出,谢谢!
鸣谢:
https://dev.mysql.com/doc/refman/5.7/en/

推荐阅读:

越俎代庖:应用广泛的代理模式

MySQL整数类型的长度到底是什么含义?

漫谈MySQL中的事务

臭名昭著,怙恶不悛的OOM,到底是什么?

俯拾皆是的Java注解,你真的get了吗?

“八面玲珑”的ZooKeeper入门介绍

责无旁贷:超酷的责任链模式

聚沙成塔:聊聊建造者模式

公司裁员,码农竟然成了“帮凶”?(剧情杜撰)

本篇文章来源于微信公众号: 互联网全栈架构



微信扫描下方的二维码阅读本文

此作者没有提供个人介绍
最后更新于 2023-11-08