Flask-SQAlchemy with_for_update()返回旧数据

时间:2018-08-10 12:41:43

标签: python mysql flask sqlalchemy flask-sqlalchemy

我的Flask应用程序中有一种情况,我需要针对消费者生成越来越多的数字。为此,每个消费者在单独的表中都有一行,直到现在为止都保存着数字生成器。

由于可能同时有多个请求降落在服务器上,因此我锁定了用于更新的行,然后更新数据并提交。但是,提交后,其他请求正在读取同一行的旧数据。

我正在对模型的查询执行with_for_update。读取数据,然后更新,但是,第二个请求读取旧数据。通过将数据库隔离级别设置为更高的隔离级别(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

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。请参阅以下问题以获取解决方案https://github.com/sqlalchemy/sqlalchemy/issues/4774

简而言之,最简单的方法是添加populate_existing()进行查询

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