MySQL在一个事务中发生死锁问题记录
MySQL在一个事务中发生死锁问题记录
背景:公司有个删除产品的需求,产品表和多张表关联,删除产品时其相关联数据也需要删除
写完代码进行测试时,发生报错:
看报错原因应该是产生了死锁,至于为什么产生死锁,经过分析定位到了以下 sql:
BEGIN;
DELETE FROM tb_pdm_part WHERE id IN (SELECT part_id FROM tb_pdm_product_mapping WHERE product_id = 1);
DELETE FROM tb_pdm_product_mapping WHERE product_id=1;
COMMIT;
代码中加了事务,这里通过
BEGIN
、COMMIT
来模拟
产生死锁的原因:
在事务中执行写操作时,表会自动加锁,第一条 sql 执行后tb_pdm_product_mapping
表就已经加锁了,导致后面的 sql 进行读或写操作时需要等待前面的锁释放才能执行,因此产生死锁
show open tables
查看数据库中的表是否上锁,In_use 为0表示没有上锁,为1表示上锁
解决方法:
将第一条 sql 分开,改成以下 sql:
SELECT part_id FROM tb_pdm_product_mapping WHERE product_id = 1;
DELETE FROM tb_pdm_part WHERE id IN ();
分开以后就不会产生死锁了,因为事务中执行读操作表不会自动加锁
记得快乐
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix