gpt4 book ai didi

python - 在 Sqlalchemy 查询中忽略 MYSQL 数据库中的锁

转载 作者:太空狗 更新时间:2023-10-29 21:10:48 34 4
gpt4 key购买 nike

使用 SQLAlchemy 查询 MySQL 数据库时出现以下错误:

sqlalchemy.exc.OperationalError: (raised as a result of Query-invoked autoflush; consider using a session.no_autoflush block if this flush is occurring prematurely) (_mysql_exceptions.OperationalError) (1205, 'Lock wait timeout exceeded; try restarting transaction')

首先,我假设错误消息评论“如果此刷新过早发生,请考虑使用 session.no_autoflush block ”是关于另一个 session 放置锁,而不是我用于当前查询的 session ?如果我遵循这个建议,这是否有助于避免对数据库的一般锁定?其次,我只需要读取,不需要对查询结果进行写入修改,所以我想知道如何忽略锁,只读取数据库中当前的内容。我相信 sql 是 NOWAIT,但我不知道如何在 sqlalchemy API 中执行此操作。

最佳答案

假设您使用的是 mysql.connectorautocommit 属性的默认值为 False,这可能会导致您的脚本因其他 session 正在等待完成而挂起。

SQLAlchemy 使用 BEGIN statements ,(START TRANSACTION 的别名)导致 session 获取表/数据库的 LOCK,您的连接将等待直到锁获得批准。

要克服这种行为(并且由于您说过您只需要在 session 期间读取数据这一事实),您可以在创建 session 时设置 autocommit=True:

Session = sessionmaker(bind=engine, autocommit=True)

另一种选择 - 在创建 session 后,您可以执行 SET AUTOCOMMIT=1:

s = Session()
s.execute("SET AUTOCOMMIT=0")

You can also try to set the autocommit property directly in the connection string:

engine = create_engine("mysql+mysqlconnector://user:pass@localhost/dbname?autocommit=1")

However I didn't test it. According to the documentations it should work.

关于python - 在 Sqlalchemy 查询中忽略 MYSQL 数据库中的锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38382028/

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