什么时候提交SQLAlchemy Core?

时间:2017-01-12 22:39:21

标签: python mysql sqlalchemy

我一直试图对此进行测试,但未能得出明确的答案。我在MySQL之上使用SQLAlchemy并尝试阻止执行select的线程,在某些表上获得SHARED_READ锁,然后保持它(防止将来的DDL操作直到它被释放)。未提交查询时会发生这种情况。我正在使用SQLAlchemy Core,据我所知,.execute()基本上可以在autocommit模式下工作,在运行它之后发出COMMIT,除非明确告诉我们在事务中。然而,在show processlist中,我看到睡眠线程在他们曾经查询过的表上仍然有SHARED_READ个锁。是什么给了什么?

1 个答案:

答案 0 :(得分:1)

假设您的帖子是在“非事务性”模式下运行,请使用SQLAlchemy Line2D而不进行正在进行的事务,或使用简写Connection。在这种操作模式下,SQLAlchemy将检测engine.execute()INSERTUPDATE和DDL语句,并在自动后发出提交,但不会对所有内容发出提交,例如DELETE语句。见"Understanding Autocommit"。对于选择变异存储过程以及确实需要提交,请使用

SELECT

当线程暂时完成时,您还应该考虑关闭连接。关闭将在基础DBAPI连接上调用conn.execute(text('SELECT ...').execution_options(autocommit=True)) ,每个PEP-0249(可能)始终处于事务状态。这将删除事务状态和/或锁定,并返回到连接池的连接。这样您就不必担心选择不自动提交。