首页 > 解决方案 > 选择查询后清除对 postgres 关系的访问共享锁定

问题描述

我知道当我们select在 postgres 表上运行查询时,它会获取一个AccessShareLock. 它仅在我运行select查询的表上创建,而不是在其他表上创建。我正在使用 sqlalchemy 与 postgres 交互,我想要的只是我们是否可以在执行 select 语句后清除(下面是从这里AccessShareLock复制的示例

from sqlalchemy.orm import sessionmaker
from models import OneTable, get_engine

engine = get_engine(database="mydb")
session = sessionmaker(bind=engine)()

results = session.query(OneTable.company_name).all()

# need to remove "AccessShareLock" lock on OneTable
# without explicitly calling session.close() or engine.dispose()

session.close()

我只需要在查询表后释放锁。我正在运行一些守护程序服务,它们定期查询数据库(比如一小时一次),但是我在这个表上的 DDL 语句没有按需要执行AccessExclusiveLock。关于如何完成这项工作或我应该如何解决这个问题的任何建议

标签: pythonpostgresqlsqlalchemy

解决方案


释放表上的锁的唯一方法是终止获取锁的事务,使用COMMITROLLBACK锁定始终保持到事务结束。

所以获得你需要的东西的方法是确保你所有的交易都是短的。除了解决您的问题之外,这还将确保 autovacuum 可以有效地删除旧行版本。


推荐阅读