记一次测试环境遇到的死锁问题

记录一个测试环境遇到死锁的问题

表现如下

111

代码抛出死锁异常,准备去数据库看一下最后一次死锁的情况, 看是和另外哪条sql发生了死锁

然后竟然没有测试库数据库系统表的查看权限,🐶,但是show processlist的权限又有

于是让运维执行 show engine innodb status 发给我结果

后面还有一大堆日志,不过我觉得不重要了,从上面的信息2个截图分别是2个事务发生了死锁,Mysql回滚了第二个事务

并且这2个SQL是一样的,那就分析这个sql吧

update customer_device     set customer_name = ?,       start_time = ?,       end_time = ?,       update_time = ?,       customer_time = ?     where customer_code = ? and device_code = ? and project_id = ? and is_active = 1

数据库有这4个索引

所以这个修改是会命中索引呢,那为什么还会死锁呢,按道理命中索引的修改不应该是行锁吗

但是我没有数据库系统表查询权限,不然通过下面的sql应该很容易定位

SELECT * FROM information_schema.innodb_trx;  
SELECT * FROM information_schema.innodb_locks; 
SELECT * FROM information_schema.innodb_locks; 

后来我只能自己手动起2个事务来测试,发现确实表锁了。。。

然后我把 customer_code 的索引修改成了 customer_code, device_code的索引,并且删除了device_code的索引

然后 就好了,重新执行sql变成行锁了, 🐶, 然后测试环境再也没有出现这个死锁错误了

posted @ 2021-12-26 00:11  随风森林  阅读(61)  评论(0)    收藏  举报