Hi, I am writing some unit tests, and I am getting blocked waiting for a 
metadata lock (in MySQL) due to an open connection.

The code is roughly:

metadata.drop_all(engine)
metadata.create_all(engine)
conn = engine.connect()
sql = sa.text('select * from table')
rows = conn.execute(sql).fetchall()
print(conn.closed) # False
print(conn.in_transaction()) # False
# conn.close()  # This seems to be required!
metadata.drop_all(engine) # is blocked
metadata.create_all(engine)


A single table is sufficient. So basically:  drop, create, select, drop, 
create.  The hang happens at the second "drop".  

This seems to be related to autocommit 
(https://docs.sqlalchemy.org/en/latest/core/connections.html#understanding-autocommit)
 
and if I'm understanding it correctly, the issue is that there must still 
be a transaction open. Had I done DML instead of a SELECT, SQLAlchemy would 
have autocommitted for me and there would have been no block. Had I 
executed with `execution_options(autocommit=True)`, then there would have 
been no block. Had I used a transaction via `with conn.begin()`, then 
similarly, there would have been no block. Had I also executed: 
`conn.execute(sa.text('COMMIT'))` then the transaction would have been 
closed and there would have been no block.

Assuming the above is correct, why is it that `conn.in_transaction()` does 
not indicate that a transaction is in progress?

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to