gpt4 book ai didi

python - SQLAlchemy 关系加载器在表上留下锁?

转载 作者:可可西里 更新时间:2023-11-01 07:08:21 24 4
gpt4 key购买 nike

我有非常简单的代码导致我的 MySQL 数据库挂起:

import sqlalchemy as sa
from sqlalchemy import orm

# creating the engine, the base, etc
import utils
import config

utils.base_init(config)
Base = config.Base

class Parent(Base):
__tablename__ = 'Parents'
id = sa.Column(sa.Integer, primary_key=True)
children = orm.relationship('Child', backref='parent')

class Child(Base):
id = sa.Column(sa.Integer, primary_key=True)
parent_id = sa.Column(sa.Integer)

__tablename__ = 'Children'

__table_args__ = (sa.ForeignKeyConstraint(
['parent_id'],
['Parents.id'],
onupdate='CASCADE', ondelete='CASCADE'),{})

Base.metadata.create_all()

session = orm.sessionmaker(bind=config.Base.metadata.bind)()
p = Parent(id=1)
c1 = Child(id=1)
c2 = Child(id=2)
session.add(p)
session.add(c1)
session.add(c2)
session.commit()

# Works
# Base.metadata.drop_all()

c1.parent
# 2012-08-17 20:16:21,459 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
# 2012-08-17 20:16:21,460 INFO sqlalchemy.engine.base.Engine SELECT `Children`.id AS `Children_id`, `Children`.parent_id AS `Children_parent_id`
# FROM `Children`
# WHERE `Children`.id = %s
# 2012-08-17 20:16:21,460 INFO sqlalchemy.engine.base.Engine (1,)



Base.metadata.drop_all()
# hangs until i kill the connection above.
# server status: 'Waiting for table metadata lock'

看起来 SQL Alchemy 在发出加载关系属性所需的选择查询后没有释放元数据锁?我怎样才能让它释放它?我什至不明白为什么 select 语句首先需要锁定表!

当然,我可以通过关闭 session 来让这段特定的代码工作,但这在我的实际程序中是不切实际的。

最佳答案

您需要在.drop_all() 调用之前开始一个新事务; MySQL 看到您在此事务中从表中读取数据,并锁定该表以防止被删除:

session.commit()
Base.metadata.drop_all()

提交事务隐含地开始一个新事务。

MySQL 保证事务隔离;您的事务将读取一致的数据,并且在您开始新事务之前不会看到其他事务提交的更改。然而,DROP TABLE 语句使 MySQL 无法保持这些保证,因此表被锁定。

或者,您可以更改事务隔离级别,告诉 MySQL 您不关心隔离保证。因为 session 连接是池化的,所以这只能对所有连接进行,或者根本不进行;使用 create_engine()isolation_level 参数:

engine = create_engine(
'mysql://username:passwd@localhost/databasename',
isolation_level='READ UNCOMMITTED')

参见 SET TRANSACTION documentation有关每个隔离级别的详细信息。

关于python - SQLAlchemy 关系加载器在表上留下锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12014824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com