2016-11-20 50 views
1

私は 'User'というモデルを持っていて、 'User'は 'Money'を持っています。
複数のセッションがモデル 'User'を読み込み、同時に 'money'を更新できるシナリオがあります。Flask-SQLAlchemy with_for_update()行ロック

セッション1は、セッション1が正常に更新された後、「money」値を読み取る必要があります。
更新時に「ユーザー」行をロックしようとしました。
ここに私のコードです。私は同時に、このコードを実行するには、2つのセッションを開いた

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は、更新された値を読み取れませんでした。

問題がどこにあるか本当に知りたいです。

答えて

3

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 

はい、そう単純ではあるが

迷惑でなければなりません