记一次测试环境遇到的死锁问题
记录一个测试环境遇到死锁的问题
表现如下

代码抛出死锁异常,准备去数据库看一下最后一次死锁的情况, 看是和另外哪条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变成行锁了, 🐶, 然后测试环境再也没有出现这个死锁错误了
浙公网安备 33010602011771号