数据库死锁问题之一

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

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值