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