最近遇到一个问题,deadLock(死锁),由于mysql的事务导致的死锁,本事这个bug不是问题,关键是解决问题的过程比较有意思。
1、收到问题之后,我这先看了,mysql 的日志,然后各种分析重现问题,结果浪费两天时间,只是知道问题原因在那。给出的解决方案如下:1)、找到死锁的代码,调整执行顺序。2)把整个大的事务拆成小的事务,应为那块代码太繁杂了。总之,问题没有得到很好的解决。
2、咨询A同事:你这个业务场景不应该用这样的代码,应该用redis incr 。
3、咨询B同事:详细的聊了一下mysql死锁的原因,因为业务逻辑复杂,最终没有结论。
4、咨询C同事:详细的说了业务流程,(省略100字)。把我们频繁的数据库操作,在java代码层实现,最后更新数据库,避免频繁更新数据库造成死锁。
最开始,我不感觉这是一个好的方案,只是尽可能回避了死锁,没有最终解决死锁。后来仔细想象,发现这个是目前最靠谱的办法:
1)改动最小。
2)虽然没有最终解决死锁,但是回避了死锁。数据量不大的话,那么问题是解决了。
最后,我问自己一个问题,当出现问题,第一时间应该怎么处理。