mysql死锁问题

今天在日志中发现有mysql死锁问题

(1)定位死锁

在MySQL客户端下输入命令(在navicat中不行): 
第一种(输出到控制台):show engine innodb status \G; 

第二种(输出日志到文件):

cd C:\Program Files\MySQL\MySQL Server 5.7\bin

mysql -u root -p --execute="show engine innodb status \G" > d:/mysql.log

输入mysql密码,输出日志到文件

查看死锁

在打印出来的信息中找到“LATEST DETECTED DEADLOCK”一节内容,下面有死锁的sql

2条sql


1)update meter_item_data set laster_read_value=1.0,ip_is_open=0, no_data_times=0,laster_read_time='2020-09-25 09:23:05',shiji_time=now()  where id='72bb8186a6-a61d-453b-9d4d-fa6219c8271e'

id是主键,使用了排它锁X

2)update meter_item_data set no_data_times=4 where meter_terminal_id in(SELECT  a1.id  FROM ( SELECT IFNULL( max(mid.laster_read_time), 0 ) AS max_time, ui.id FROM user_info ui, meter_item_data mid WHERE ui.meter_type_id = '1' AND mid.meter_terminal_id = ui.id AND mid.meter_item_id NOT IN ( SELECT mi.id FROM meter_item mi WHERE mi.a_v_c = 'c' ) GROUP BY ui.id ) AS a1 WHERE max_time < '2020-09-25 05:23:10')

meter_terminal_id 是普通索引,in后面的查询用了共享锁S

(2)解决办法:把第2条sql的update后面的where改成使用主键索引或唯一索引,或者拆分成2个sql,先查询再更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值