我了解到,当我们在postgres表上运行select
查询时,它将获得一个AccessShareLock
。它仅在我已运行select
查询的表上创建,而不在其他表上创建。我正在使用sqlalchemy与postgres进行交互,我想要的只是在执行select语句后是否可以清除AccessShareLock
(下面是从here复制的示例
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()
我需要做的就是在查询表后释放锁。我正在运行一些守护程序服务,这些服务定期(例如每小时一次)查询数据库,但由于需要AccessExclusiveLock
,因此未执行此表上的DDL语句。关于如何完成此工作或应该如何解决此问题的任何建议
答案 0 :(得分:0)
释放表锁的唯一方法是使用COMMIT
或ROLLBACK
终止获得该锁的事务。 锁始终保持到交易结束。
因此,获取所需内容的方法是确保所有交易都简短。除了解决您的问题外,这还将确保自动清理可以有效删除旧行版本。