FLask python线程获取不到数据库最新数据

场景:
在flask框架中,起了一个线程,线程中会定时循环查询LogAlarm表的最新的内容并展示,数据的获取是通过ORM连接进行查询的,如下:
每5秒进行一次查询

logs = LogAlarm.query.filter(LogAlarm.level <= int(level), LogAlarm.action == 0).limit(100)

问题:
在LogAlarm表新增或删除或者修改了数据之后,每次获取的数据不变,还是第一次获取的数据。

解决方案:
在每次查询之后,加上事务提交:

logs = LogAlarm.query.filter(LogAlarm.level <= int(level), LogAlarm.action == 0).limit(100)
db.session.commit()

原因:
基于InnoDB默认的repeatable read事务隔离和select为快照读可知,连接池中的连接在初始化时,没有设置autocommit为True,会导致复用同一个连接的多次select查询其实都在一个事务内,且都为快照读,这样,每个select查的数据源并不是表中的最新数据,而是第1个查询时的快照,因此导致查不到表中其他事务写入的最新数据。
所以解决方法是

  1. 将autocommit设置为True后,每个事务中只有1个查询,下一个查询属于一个全新的事务,这样就能读到新事务开始前的最新数据了。
  2. 如果由于项目原因不能将autocommit设置为True,那么就需要在每次查询后,手动加上commit即可,那么下次的查询就会是一个新的事务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值