Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQL Alchemy Relationship Loader hinterlässt eine Sperre auf der Tabelle?

Sie müssen vor .drop_all() eine neue Transaktion starten Anruf; MySQL sieht, dass Sie in dieser Transaktion aus der Tabelle lesen, und sperrt die Tabelle gegen das Löschen:

session.commit()
Base.metadata.drop_all()

Das Festschreiben einer Transaktion beginnt implizit eine neue Transaktion.

MySQL garantiert die Transaktionsisolation; Ihre Transaktion liest konsistente Daten und sieht keine Änderungen, die von anderen Transaktionen übernommen wurden, bis Sie eine neue Transaktion starten. Eine DROP TABLE -Anweisung macht es MySQL jedoch unmöglich, diese Garantien einzuhalten, sodass die Tabelle gesperrt wird.

Alternativ könnten Sie die Transaktionsisolationsstufe ändern und MySQL mitteilen, dass Ihnen die Isolationsgarantien egal sind. Da Sitzungsverbindungen gepoolt werden, kann dies nur für alle Verbindungen oder gar keine erfolgen; Verwenden Sie die isolation_level Argument für create_engine() :

engine = create_engine(
    'mysql://username:[email protected]/databasename',
    isolation_level='READ UNCOMMITTED')

Siehe SET TRANSACTION Dokumentation für Details zu jeder Isolationsstufe.