背景
某日清晨,风和日丽,突然间业务小妹妹就跑过来问我:"这个xxx功能又不行了,重新执行一遍又好了,你们系统怎么搞得!",我一边安抚业务小妹妹,一边打开电脑搜索起来的日志
好家伙,看起来是在执行这条delete语句的时候死锁了啊。
由于业务反馈的是前一天的问题,现场肯定是没有了,只能去实例里面捞捞看。
我们在数据库实例可以执行Show Engine INNODB STATUS
如果近期存在死锁,我们可以看到
我们把Status里面的东西拿出来进行分析
很明显在新增删除两张表数据的时候,两个线程事务相互持有了一部分锁且都在等待另一方释放锁,不存在超时释放,形成了死锁。
接着就是通过日志定位到代码
两种解决办法:
- 事务方法调用加上分布式锁等待,保证同一时间只有一个事务执行。
- 选择某个数据库更新走单独事务。
朋友们,你们还有其他更好的方式吗??