我有一个名为' User'和' User'有金钱' 有一种情况是多个会话可以读取模型'用户'并更新' money'在同一时间。
第二节应该阅读“钱”。会话1成功更新后的值 我试图锁定用户'更新时排 这是我的代码。
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节没有读取更新后的值。
我真的想知道问题所在。
答案 0 :(得分:6)
经过一整天的努力,我发现了问题。
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
是的,这么简单但很讨厌
答案 1 :(得分:0)
您只需要声明您想要锁定的内容即可
user = User.query.with_for_update(of=User).filter_by(id=userid).first()
user.money -= 0.1