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

  • Möglich, ein Objekt zur SQLAlchemy-Sitzung ohne explizite Session.add () hinzuzufügen?
  • Wann soll ich auf SQLAlchemy bush () aufrufen?
  • SQLAlchemy - INSERT ODER ERSETZEN Äquivalent
  • Wie man für leere Datensätze in vielen zu vielen Relationen abfragt
  • Wie kann ich programmgesteuert die von Alembic benötigten 'target_metadata' für die Befehls-API programmieren?
  • Konfigurieren von Django zur Verwendung von SQLAlchemy
  • Verwenden von postgresql xml Datentyp mit sqlalchemy
  • Holen Sie sich eine polymorphe Unterklasse, die die Superklasse und die polymorphe Identität gegeben hat
  • Generischer TEXT / CLOB-Datentyp für die übergreifende SQLAlchemy-Anwendung
  • Wie man einen Spaltennamen in sqlalchemy mit Reflexion und beschreibenden Syntax überschreibt
  • SQLAlchemy distinct () gibt keine eindeutigen Datensätze mit einer Keyword-Suche zurück
  • Python ist die beste Programmiersprache der Welt.