数据库死锁问题之一

首先,我是用的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

 

 

 

 

你可能感兴趣的:(java开发,开发)