sqalchemy with_for_update()返回旧数据

jv4diomz  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(402)

在我的flask应用程序中有一种情况,我需要针对一个消费者生成递增的数字。为此,每个消费者在一个单独的表中都有一行,该表将数字生成器保存至今。
由于多个请求可能同时到达服务器,因此我将锁定行以进行更新,然后更新数据并提交。但是,在提交之后,其他请求正在读取同一行的旧数据。
我在做一件事 with_for_update 在模型的查询上。读取数据,然后更新,但是第二个请求读取旧数据。尝试将db隔离级别设置为更高的级别( SERIALIZABLE )但没用。
示例代码:

obj = NumberGenerator.query.filter(
    NumberGenerator.consumer_id == consumer_id
).with_for_update().first()

obj.number = obj.number + 1

db.session.add(obj)
db.session.commit()

第二个请求读取旧数据。我不明白为什么会这样。我也试过同样的方法 iPython 它完美地工作了。试着生硬地写 MySQL 查询使用 MySQLdb ,这也奏效了。在各种论坛(包括堆栈溢出)和软件包文档上搜索了很多,但什么都找不到。
Flask-SQLAlchemy version: 2.3.2 MySQL version: 5.6

doinxwow

doinxwow1#

我也遇到过同样的问题。有关解决方案,请参阅以下问题https://github.com/sqlalchemy/sqlalchemy/issues/4774
简而言之,最简单的方法就是添加 populate_existing() 查询

obj = NumberGenerator.query.filter(
    NumberGenerator.consumer_id == consumer_id
).with_for_update().populate_existing()

相关问题