SQLAlchemie – Einheit nicht als abgelaufen markiert

Ich habe Multi-Thread python3 Werkzeug, um andere Prozesse zu verwalten. Ich verwende Datensätze in der Datenbank zu markieren, dass bestimmte Prozess ist jetzt beschäftigt.

class Process(base): id = Column('ID', Integer, primary_key=True) name = Column('NAME', String(128)) tasks = relationship('ProcessTask', back_populates="process", cascade="all, delete-orphan", passive_deletes=True) """ :type: list[ProcessTask] """ class ProcessTask(base): id = Column('ID', Integer, primary_key=True) process_id = Column('PROCESS_ID', Integer, ForeignKey('PROCESS.ID', ondelete='CASCADE', onupdate='CASCADE'), nullable=False) status = Column('STATUS', String(128), nullable=False) process = relationship(Process, back_populates="tasks") """ :type: Process """ 

Zum Beispiel haben Aufgaben nur zwei mögliche Status – "laufen" und "fertig"

Ich stand vor einem Problem:

  • Thread1 erstellt Aufgabe für einen Prozess
  • Thread2 überprüft die Verfügbarkeit dieses Prozesses. Prozess ist beschäftigt. Thread2 schlafen, bis die Aufgabe als fertig markiert ist
  • Thread1 markiert die Aufgabe als fertig
  • Thread2 nicht "sehen" Änderungen der ProcessTask Entity und schläft für immer

Ich habe versucht zu verarbeiten ProcessTask Entity wie abgelaufen über session.expire(entity) in thread2 – funktioniert nicht.

Was mache ich falsch?


Dies ist der Code, den ich verwende, um Session-Fabrik zu erstellen:

 connString = "mysql+mysqlconnector://{userName}:{userPass}@{host}:{port}/{dbName}".format(...) self._db_engine = sqlalchemy.create_engine(connString, pool_size=100, pool_recycle=3600) self._db_session_factory = sqlalchemy.orm.sessionmaker(bind=self.getEngine()) self._db_session = sqlalchemy.orm.scoped_session(self._db_session_factory) 

Jeder Thread erstellt eine eigene Session von self._db_session()

One Solution collect form web for “SQLAlchemie – Einheit nicht als abgelaufen markiert”

Ursache des Versagens war die Isolationsstufe von MySQL-Transaktionen.

Die Standardisolationsstufe von MySQL-Transaktionen ist REPEATABLE READ . Zuerst lesen Sie die Operation innerhalb der Transaktion MySQL erstellt Snapshot der Datenbank und während der Transaktion, die Sie aus diesem Snapshot lesen. So können Sie keine Änderungen lesen, die von anderen Threads vorgenommen wurden, bis die Transaktion abgeschlossen ist.

Um dieses Verhalten zu beheben, musste ich die Isolationsstufe auf READ COMMITTED

https://dev.mysql.com/doc/refman/5.0/de/set-transaction.html

http://docs.sqlalchemy.org/en/rel_1_0/orm/session_transaction.html#setting-transaction-isolation-levels

  • TypeError: eine Ganzzahl ist erforderlich, SQLAlchemy + Flask
  • Wie kann man den Spaltentyp vom Zeichen ändern, der sich in der Ganzzahl mit sqlalchemy-migrate unterscheidet
  • KeyError beim Hinzufügen von Objekten zum SQLAlchemy-Assoziationsobjekt
  • MySQL-Verbindung nicht verfügbar bei Verwendung SQLAlchemy (MySQL) und Flask
  • Kann den Namen nicht importieren
  • Warum ist SQLAlchemy mit sqlite 25 mal langsamer einsetzbar als mit sqlite3 direkt?
  • Fehler beim Ausführen von imdbpy2sql.py mit MySQL-Datenbank
  • SQLAlchemy mit count, group_by und order_by mit dem ORM
  • PostgreSQL ILIKE Abfrage mit SQLAlchemy
  • SQLAlchemy AttributeError: 'Modul' Objekt hat kein Attribut 'PandasSQLAlchemy'
  • SQLAlchemie: eine effiziente / bessere Auswahl durch Primärschlüssel?
  • Python ist die beste Programmiersprache der Welt.