前脚刚往数据库插入数据,后脚就查不出来?

494 阅读1分钟

线上出现了一个Bug,前脚刚插入的数据,后脚就查不出来。导致了请求的失败, 数据库还可不可信了?

先看看代码流程

这是一个很简单的流程,就是插入了一条数据,然后紧接着select。

insert test (id) values (1);select test where id=1; => 查出来为空

前脚刚插入,而且采用的是自动提交模式,那么insert这条就自动提交了。那为何紧接着查不出来呢?这个是在同一个线程之内啊,不存在时序混乱的问题。这时候,我们就得看看我们的环境了

部署模式

我们先看一看我们的应用部署模式吧。

我们的应用是通过APP是通过DBProxy去查询数据库的。DBProxy可以有效的管理连接,以及一系列的分析/审计/权限功能,相当好用。
在它们提供的功能里面,有一项功能引起了我的注意,就是透明主从功能。这个功能的描述为:

推理

按照启用了这个功能后,我们的sql执行模式应该是这样insert到主库而select到从库。

这时候只要主从稍微有些延迟,那么select去从库就找不到数据从而引起问题了!

解决方案

首先,我们让DBProxy先下掉这个功能,至于主从负载分离,我们采用了另一个方案。

虽然需要修改代码,但比起线上出问题好多了。

最后

感谢大家看到这里,文章有不足,欢迎大家指出;如果你觉得写得不错,那就给我一个赞吧。