我的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
答案 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()