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 ();
分开以后就不会产生死锁了,因为事务中执行读操作表不会自动加锁
记得快乐