PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

SQLAlchemy with_for_update blokowanie wierszy nie działa?

Dwie sesje powinny wyglądać tak:

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

i

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

Aby wykonać FOR UPDATE działać poprawnie, wszystkie zaangażowane transakcje, które zamierzają zaktualizować wiersz, muszą z niego korzystać.

W twoim przykładzie sesja 2 nie używa with_for_update . Ponieważ nie kazałeś mu używać FOR UPDATE , można odczytać starą wartość wiersza (ponieważ nowa wartość nie została jeszcze zatwierdzona, a blokady nie blokują czystych czytelników), a następnie zmodyfikować tę wartość w pamięci, a następnie zapisać ją z powrotem.

Jeśli nie chcesz używać FOR UPDATE wszędzie tam, gdzie czytasz wiersz z zamiarem jego zmiany, możesz zamiast tego użyć isolation level serializable wszędzie. Jeśli jednak to zrobisz, rzeczy mogą się nie blokować, ale raczej będą wyglądać na szczęśliwe do czasu zatwierdzenia, a następnie wyrzuć błędy serializacji, które będą musiały zostać przechwycone i rozwiązane.

Uwaga: Twój przykład przed edycją powinien zadziałać, ponieważ obie sesje zostały oznaczone tagiem 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. Pobieranie najpopularniejszych słów kluczowych z kolumny tsvector

  2. Python:Pobieranie wyników zapytania PostgreSQL jako sformatowanych wartości JSON

  3. Proszę polecić najlepszą opcję usuwania zbiorczego

  4. transfer danych z jednej bazy danych do innej bazy w odoo

  5. Jak uzyskać kluczowe pola dla tabeli w funkcji plpgsql?