• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Y-wee
博客园    首页    新随笔    联系   管理     

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 ();

​ 分开以后就不会产生死锁了,因为事务中执行读操作表不会自动加锁

记得快乐
posted @ 2023-07-27 16:35  Y-wee  阅读(136)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3