我一直试图对此进行测试,但未能得出明确的答案。我在MySQL之上使用SQLAlchemy并尝试阻止执行select的线程,在某些表上获得SHARED_READ
锁,然后保持它(防止将来的DDL操作直到它被释放)。未提交查询时会发生这种情况。我正在使用SQLAlchemy Core,据我所知,.execute()
基本上可以在autocommit
模式下工作,在运行它之后发出COMMIT
,除非明确告诉我们在事务中。然而,在show processlist
中,我看到睡眠线程在他们曾经查询过的表上仍然有SHARED_READ
个锁。是什么给了什么?
答案 0 :(得分:1)
假设您的帖子是在“非事务性”模式下运行,请使用SQLAlchemy Line2D
而不进行正在进行的事务,或使用简写Connection
。在这种操作模式下,SQLAlchemy将检测engine.execute()
,INSERT
,UPDATE
和DDL语句,并在自动后发出提交,但不会对所有内容发出提交,例如DELETE
语句。见"Understanding Autocommit"。对于选择变异存储过程以及确实需要提交,请使用
SELECT
当线程暂时完成时,您还应该考虑关闭连接。关闭将在基础DBAPI连接上调用conn.execute(text('SELECT ...').execution_options(autocommit=True))
,每个PEP-0249(可能)始终处于事务状态。这将删除事务状态和/或锁定,并返回到连接池的连接。这样您就不必担心选择不自动提交。