并发数较高时,MySQL死锁问题

问题描述

Java程序在进行压测过程中出现DB死锁问题,日志内容如下:

- 保存接口调用日志出错,原因:[DOMA2009] The SQL execution is failed.
The cause is as follows: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
The root cause is as follows: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction

问题解决

1、根据日志中出现的报错SQL定位至具体代码,发现此处仅执行了一条insert语句,猜测应该有别的语句影响,但是复盘此处业务流程,不存在该现象。

2、MySQL查看最近死锁的日志

show engine innodb status

下面是对查询到的死锁日志进行分析
(1)代表第一个事务,下图表示:第一个事务等待锁的释放
在这里插入图片描述
(2)代表第二个事务,下图表示:持有一个锁,并等待另一个锁的释放
在这里插入图片描述
可以看出问题出在delete_flag_index索引,然而根据业务情况,该索引对应的delete_flag字段可能值仅为0或者1,建立索引是非常不合适的,所以删除索引。

drop index delete_flag_index on api_log

3、再次进行压测,不存在死锁,问题解决。

重点

回到上面说的问题,代码此处仅涉及一条insert语句,那为何会出现死锁呢???
原因就是,忽略了触发器!!!根据死锁日志列出来的两个事务,可以看出,第一个事务为暴露出来的insert语句,第二个事务为隐藏的触发器。
所以,在开发过程中要慎用触发器!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值