python数据库查询不出结果_记一次pymysql查询不到表中最新插入的数据的问题

问题

本周工作中遇到一个问题,同事用Python和公司的db客户端在团队的测试框架上实现连接池功能,db连接用的是pymysql。但在跑demo时,出现了诡异的现象:

多次select查询表中数据

所有的查询结果都是准确无误的。eg:(以下sql脱敏处理过,和真实的sql不一致)

select * from pay p where p.pay_id = '1111111111'

先写库(调服务接口去下单),再去db读刚刚写入的订单数据,eg:(''为接口返回的刚刚写入库中的订单id)

select * from pay p where p.pay_id = ''

诡异的事发生了。连接池中的连接只有在第1次去查询的时候能查到刚刚落库的订单数据,之后就查不到了(查询结果为空)。比如连接池大小设置为2。那么只有前2次查询能查到最新写入的数据,第3次开始就查不到最新的数据了。

解决

之前自己对连接池和mysql也没有很深入的理解,仅仅是简单会用,书本上学过的基础理论读完就忘记了。所以,一开始我们怀疑是连接池的实现有问题(无知啊...)。但经过反复打断点,看连接池底层源码后,发现连接池的功能是没问题的。然后怀疑是不是从池中取连接时的线程锁没有生效,但是demo中的case都是顺序执行的,只有1个线程,可以排除线程不安全的问题,即问题不在线程锁上。再然后怀疑是公司的db主-从同步有延迟,因为写操作走的主库,读操作是走的从库。同事联系公司的dba同学,查了半天,没发现有问题。而且理论上,即使有延迟,也不可能是每次必现,否则公司的rd们早就炸翻天了。很诡异的问题...

然后自己就回想,为什么连续的只读操作就没问题,但凡涉及到写-读操作就有问题呢?把sql改一下试试,不用接口返回的订单id作为查询条件去查库,而是通过时间去查库中的最新订单,看与刚刚下过的订单数据是否一致。

select * from pay p order by p.create_time desc limit 1

结果诡异的现象出现了,比如连接池大小设置为2,现在有5条下单用例,结果如下:

第1条用例(使用的是

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值