Flask SQLAlchemy with_for_update()

2024-04-25 01:28:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为“User”的模型,“User”有“Money”。
在这种情况下,多个会话可以同时读取模型“User”和更新“money”。

会话2应在会话1成功更新后读取“money”值。
我试图在更新时锁定“用户”行。
这是我的密码。

user = User.query.with_for_update().filter_by(id=userid).first()
print('000000')
before_money = user.money
print('111111')
time.sleep(1)
user.money -= 0.1
print('User:' + str(user.id) + '***' + str(before_money) + '-' + str(0.1) + ' = ' + str(user.money))
time.sleep(1)
db.session.commit()
print('22222')

我打开两个会话同时运行此代码,输出

000000
111111
User:1***125.3-0.1 = 125.2
000000
111111
22222
User:1***125.3-0.1 = 125.2
22222

会话2未读取更新的值。

我很想知道问题出在哪里。


Tags: 用户模型id密码time情况sleepquery
2条回答

您只需说明要锁定的内容:

user = User.query.with_for_update(of=User).filter_by(id=userid).first()
user.money -= 0.1

经过一整天的挣扎,我发现了问题。

user = User.query.with_for_update().filter_by(id=userid).first()

应该是

result = db.session.query(User.money).with_for_update().filter_by(id=userid).first()
money = result[0]
user.money = money - 0.1

是的,很简单但很烦人

相关问题 更多 >