sql >> Databáze >  >> RDS >> PostgreSQL

SQLAlchemy with_for_update zamykání řádku nefunguje?

Tyto 2 relace by měly vypadat takto:

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

a

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

Aby FOR UPDATE správně fungovat, vše příslušné transakce, které mají v úmyslu řádek aktualizovat, jej musí použít.

Ve vašem příkladu relace 2 nepoužívá with_for_update . Protože jste mu neřekli, aby použil FOR UPDATE , je zdarma načíst starou hodnotu řádku (protože nová hodnota ještě nebyla potvrzena a zámky neblokují čisté čtečky), poté ji upravit na hodnotu v paměti a poté ji zapsat zpět.

Pokud nechcete použít FOR UPDATE všude, kde čtete řádek s úmyslem jej změnit, můžete místo toho použít isolation level serializable všude. Pokud to však uděláte, věci se nemusí zablokovat, ale spíše se budou zdát úspěšné až do odevzdání, pak vyvolá chyby serializace, které bude třeba zachytit a řešit.

Poznámka: Váš příklad předúpravy by měl fungovat, protože obě relace byly označeny with_for_update .




  1. Problémy s databází Laravel Homestead Vagrant Box

  2. Chyba MySQL 1170 (42000):Sloupec BLOB/TEXT použitý ve specifikaci klíče bez délky klíče

  3. Spring:Jak používat KeyHolder s PostgreSQL

  4. import mysql na windows