线上出现了一个Bug,前脚刚插入的数据,后脚就查不出来。导致了请求的失败, 数据库还可不可信了?
先看看代码流程
这是一个很简单的流程,就是插入了一条数据,然后紧接着select。
insert test (id) values (1);select test where id=1; => 查出来为空
前脚刚插入,而且采用的是自动提交模式,那么insert这条就自动提交了。那为何紧接着查不出来呢?这个是在同一个线程之内啊,不存在时序混乱的问题。这时候,我们就得看看我们的环境了
部署模式
我们先看一看我们的应用部署模式吧。
我们的应用是通过APP是通过DBProxy去查询数据库的。DBProxy可以有效的管理连接,以及一系列的分析/审计/权限功能,相当好用。
在它们提供的功能里面,有一项功能引起了我的注意,就是透明主从功能。这个功能的描述为:
推理
按照启用了这个功能后,我们的sql执行模式应该是这样insert到主库而select到从库。
这时候只要主从稍微有些延迟,那么select去从库就找不到数据从而引起问题了!
解决方案
首先,我们让DBProxy先下掉这个功能,至于主从负载分离,我们采用了另一个方案。
虽然需要修改代码,但比起线上出问题好多了。
关注我,私信回复【资料】即可领取视频中java相关资料以及一份227页最新的bat大厂面试宝典
最后
欢迎大家一起交流,喜欢文章记得关注我点个赞哟,感谢支持!