PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

SQLAlchemy with_for_update заключване на ред не работи?

Двете сесии трябва да изглеждат така:

user = Student.query.with_for_update(of=Student, nowait=True).filter(Student.id == 122).first()
user.type = 1
db.session.commit()

и

user = Student.query.with_for_update(of=Student, nowait=True).filter(Student.id == 122).first()
user.type -= 1
db.session.commit()

За FOR UPDATE да работи правилно, всички участващите транзакции, които възнамеряват да актуализират реда, трябва да го използват.

Във вашия пример сесия 2 не използва with_for_update . Тъй като не сте му казали да използва FOR UPDATE , можете свободно да прочетете старата стойност на реда (тъй като новата стойност все още не е ангажирана и заключванията не блокират чистите четци), след това да я промените тази стойност в паметта, след което да я запишете обратно.

Ако не искате да използвате FOR UPDATE навсякъде, където четете ред с намерението да го промените, можете вместо това да използвате isolation level serializable навсякъде. Ако обаче го направите, нещата може да не блокират, а по-скоро ще изглеждат успешни до комита, след което ще изхвърлят грешки при сериализиране, които ще трябва да бъдат уловени и отстранени.

Забележка: Вашият пример за предварително редактиране трябваше да работи, тъй като и двете сесии бяха означени с with_for_update .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Проблем с кодирането на PostgreSQL при изпълнение на заявка от командния ред

  2. Множество CTE в една заявка

  3. Laravel 5 актуализира ограничението за един ред не работи

  4. Вземете най-новото дете на родител от голяма таблица - заявката е твърде бавна

  5. Масив от Enum в Postgres с SQLAlchemy