2016-11-20 5 views
1

У меня есть модель под названием «Пользователь», а «Пользователь» имеет «Деньги».
Существует сценарий, что несколько сеансов могут читать модель «Пользователь» и обновлять «деньги» одновременно.Flask-SQLAlchemy with_for_update() блокировка строки

Сессия 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 

Сессия 2 не читал обновленное значение.

Я бы очень хотел знать, где проблема.

ответ

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 

Да, так просто, но раздражает

Смежные вопросы