【发布时间】:2016-11-17 19:59:11
【问题描述】:
使用 SQLAlchemy 查询 MySQL 数据库我收到以下错误:
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')
首先,我假设错误消息注释“如果此刷新过早发生,请考虑使用 session.no_autoflush 块”是关于放置锁定的另一个会话,而不是我用于当前查询的会话?如果我遵循这个建议,这是否有助于避免一般的数据库锁定?其次,我只需要读取查询结果,不需要写入修改,所以我想知道如何忽略锁,只读取数据库中当前的内容。我相信 sql 现在是现在,但我看不到如何在 sqlalchemy API 中执行此操作。
【问题讨论】:
-
请提供涉及的 SQL 语句(在两个连接上),以及
SHOW CREATE TABLE和SHOW ENGINE=InnoDB STATUS;(如果可能,在问题发生时)。根据您提供的信息,我们无法判断它为何被锁定,也无法提供许多其他重要细节。 -
还提供有关 sqlalchemy 的“no_autoflush”的信息;我们需要弄清楚 MySQL 的内部构造是什么。
-
闻起来像是 SqlAlchemy 的味道妨碍了。
-
对我来说,闻起来就像 OP 甚至不确定他们在做什么:“首先,我假设 ... 是关于另一个会话放置锁,而不是我正在使用的会话我当前的查询?”还有什么会议?如前所述:提供minimal, complete and verifiable example 会有所帮助。
-
或者也许得到一个合适的 DBMS,比如 PostgreSQL 无论如何stackoverflow.com/questions/5836623/… 可能会有帮助
标签: python mysql session sqlalchemy locking