SQLAlchemy Verwendung einer MySQL-Datenbank abzufragen ich die folgende Störung erhalte:ignorieren Sperren in MySQL-Datenbank in sqlalchemy Abfrage
sqlalchemy.exc.OperationalError: (raised as a result of Query-invoked autoflush; consider using a session.no_autoflush block if this flush is occurring prematurely) (_mysql_exceptions.OperationalError) (1205, 'Lock wait timeout exceeded; try restarting transaction')
Zuerst gehe ich davon aus, dass die Fehlermeldung Kommentar zu „betrachten einen session.no_autoflush Block mit Wenn dieser Flush zu früh auftritt, "ist die andere Sitzung die Sperre, nicht die Sitzung, die ich für meine aktuelle Abfrage verwende? Wenn ich diesen Rat befolgen würde, würde dies helfen, Sperren auf der Datenbank im Allgemeinen zu vermeiden? Zweitens muss ich nur lesen und muss keine Änderungen an den Abfrageergebnissen schreiben. Daher würde ich gerne wissen, wie man die Sperre ignoriert und nur liest, was gerade in der Datenbank ist. Ich glaube, das SQL ist NOWAIT, aber ich sehe nicht, wie man das in der sqlalchemy API tut.
Bitte geben Sie die SQL-Anweisungen an (bei beiden Verbindungen) und 'SHOW CREATE TABLE' und' SHOW ENGINE = InnoDB STATUS; '(wenn möglich, wenn das Problem auftritt). Von dem, was Sie angegeben haben, können wir nicht sagen, warum es gesperrt ist, noch viele andere wichtige Details. –
Geben Sie auch Informationen zu "no_autoflush" von sqlalchemy an. Wir müssen herausfinden, was MySQL unter den Deckeln konstruiert. –
@RickJames keine SQL-Konstrukte unterly [autoflush] (http://docs.sqlalchemy.org/en/latest/orm/session_api.html#sqlalchemy.orm.session.Session.params.autoflush). Es ist nur wie SQLAlchemy-Sitzung den Status behandelt. Wenn die Sitzung ausstehende Änderungen hat, die noch nicht in die DB geleert wurden (Einfügungen, Aktualisierungen, Löschungen), werden diese vor dem Ausführen der nächsten Abfrage an die Datenbank geleert, wenn autoflush verwendet wird. Kann OP nicht ohne eine mcve helfen, etwas sperrt etwas und ein Flush wird ausgegeben, bevor irgendeine Abfrage etwas gesperrt verwendet ... –