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

在使用Flask框架时遇到一个问题,即在一个线程中每5秒查询LogAlarm表的最新内容,即使表中有新增、删除或修改,查询结果始终不变。问题源于InnoDB的repeatableread事务隔离级别和快照读特性,导致连接池中的连接在多次查询时不读取最新数据。解决方法是设置autocommit为True,确保每次查询都在新的事务中进行,从而获取最新数据。若无法设置autocommit,每次查询后手动调用db.session.commit()也能达到相同效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景:
在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、付费专栏及课程。

余额充值