Python Flask SQAlchemy与_for_update()一起返回旧数据
我的Flask应用程序中有一种情况,需要针对消费者生成越来越多的数字。为此,每个使用者在一个单独的表中都有一行,该表至今保存着数字生成器 由于多个请求可能同时到达服务器,因此我将锁定行以进行更新,然后更新数据并提交。但是,在提交之后,其他请求正在读取同一行的旧数据 我正在对模型的查询进行Python Flask SQAlchemy与_for_update()一起返回旧数据,python,mysql,flask,sqlalchemy,flask-sqlalchemy,Python,Mysql,Flask,Sqlalchemy,Flask Sqlalchemy,我的Flask应用程序中有一种情况,需要针对消费者生成越来越多的数字。为此,每个使用者在一个单独的表中都有一行,该表至今保存着数字生成器 由于多个请求可能同时到达服务器,因此我将锁定行以进行更新,然后更新数据并提交。但是,在提交之后,其他请求正在读取同一行的旧数据 我正在对模型的查询进行与\u for\u update。数据被读取,然后更新,然而,第二个请求读取旧数据。尝试将DB隔离级别设置为更高的级别(SERIALIZABLE),但无效 示例代码: obj = NumberGenerator.
与\u for\u 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
尝试了同样的方法,效果完美。
尝试使用MySQLdb
编写原始的MySQL
查询,同样有效。在各种论坛(包括堆栈溢出)和软件包文档上搜索了很多,但什么都找不到
炼金术版本:2.3.2
MySQL版本:5.6
我遇到了同样的问题。有关解决方案,请参阅以下问题
简而言之,最简单的方法是将填充_existing()
添加到查询中
obj=NumberGenerator.query.filter(
NumberGenerator.consumer\u id==consumer\u id
).with_for_update()。填充_existing()