首先,我是用的quartz定时器项目:
报Deadlock found when trying to get lock; try restarting transaction错,意思是当请求锁的时候发现了死锁,试图重新开启事务(自己翻译的。。。哈哈哈)
最初下面的2条sql是写在一起的
UPDATE t_user u ,t_shop p SET u.`c_member_level` = 4 ,p.c_member_level=4
WHERE u.`c_id`=?AND p.`c_id` = ?;
解决办法:
改成2个sql语句,然后都用主键去修改。
如果想知道原因,我的分析如下:
这样写明显不合理的,当一个sql同时修改2个表的时候,会发生死锁。https://www.cnblogs.com/OpenCoder/p/6603058.html关于这个问题,个人觉得这篇文章很好。
所以我用执行计划,对用户表而言,这c_id是这张表的主键,因此他不会收受到锁的影响;而t_shop的c_id只是一个与用户表id对应的字段,没有任何索引
EXPLAIN UPDATE t_user u SET u.`c_member_level` = 4 WHERE u.`c_id`=737;
EXPLAIN UPDATE t_shops s SET s.`c_member_level`= 2 WHERE s.`id`=5051;
id select_type TABLE TYPE possible_keys KEY key_len ref ROWS Extra
1 SIMPLE u RANGE PRIMARY PRIMARY 8 const 1 USING WHERE
id select_type TABLE TYPE possible_keys KEY key_len ref ROWS Extra
1 SIMPLE s INDEX \N PRIMARY 8 \N 1231 USING WHERE