2016-11-20 31 views
1

我有一個叫'User'的模型,'User'有'Money'。
有一種情況是多個會話可以同時讀取模型'用戶'和更新'錢'。Flask-SQLAlchemy with_for_update()row lock

第2次會話應讀取會話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 

第二節沒看過更新值。

我真的很想知道問題出在哪裏。

回答

3

經過一整天的努力,我發現了這個問題。

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 

是的,就這麼簡單,但惱人的