今天在日志中发现有mysql死锁问题
(1)定位死锁
在MySQL客户端下输入命令(在navicat中不行):
第一种(输出到控制台):show engine innodb status; (运行到mysql库)
第二种(输出日志到文件):
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,先查询再更新