在我的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
1条答案
按热度按时间doinxwow1#
我也遇到过同样的问题。有关解决方案,请参阅以下问题https://github.com/sqlalchemy/sqlalchemy/issues/4774
简而言之,最简单的方法就是添加
populate_existing()
查询