首页 > 解决方案 > Sqlalchemy 刷新和提交 ORM 对象和 mysql 元数据锁

问题描述

当我在没有提交或刷新的情况下查询 ORM 对象,然后尝试截断我metadata lock在 DB 中获取的表时。

我假设session.query(OBJ).all()它是一个 DQL 命令并且SELECT只有在事务正在进行时才具有共享锁,并且问题似乎我误解了这个问题的根本原因(现在我认为我正在使用 select 语句开始共享锁,直到我提交我的更改我会遇到这个问题)。

我做了什么来检查它是如何工作的:

s = sessionmaker(bind=engine, autocommit=Fasle, autoflush=False)
session = s()
session.query(OBJECT).all()
time.sleep(100)

在我运行的第二个终端中:

s = sessionmaker(bind=engine, autocommit=Fasle, autoflush=False)
session = s()
session.execute('TRUNCATE table OBJECT.__tablename__')
session.commit()

Waiting for table metadata lock在我的进程列表中看到。有人可以指出我正确的方向或解释为什么这种选择需要提交吗?

标签: pythonmysqlsqlalchemy

解决方案


语句中,s = sessionmaker(bind=engine, autocommit=Fasle, autoflush=False),误为autocommit=Fasle。使其自动提交=假。否则,我看不到任何其他错误。你能分享错误吗?


推荐阅读