python - 选择查询后清除对 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
。关于如何完成这项工作或我应该如何解决这个问题的任何建议
解决方案
释放表上的锁的唯一方法是终止获取锁的事务,使用COMMIT
或ROLLBACK
。锁定始终保持到事务结束。
所以获得你需要的东西的方法是确保你所有的交易都是短的。除了解决您的问题之外,这还将确保 autovacuum 可以有效地删除旧行版本。
推荐阅读
- android - Android 通知:总是展开 + 矩形
- android - 如何在 Flutter 中实现相同配色方案的布局?
- vue.js - VueJS/Vue CLI - 如何为构建添加单独的配置
- php - 我正在尝试使用 PHP 通过查询更新数据,但数据库中的数据没有变化
- reactjs - react-redux 存储数据 - reducer setter
- javascript - 在jquery中获取元素值
- flutter - 如何将一些元素从一个 Map 复制到 Dart/Flutter 中的新 Map 中?
- python - 使用 selenium 向 Google colab 发送输入
- c# - Visual Studio 2019 的任何扩展/插件,以查看从接口继承的方法
- javascript - 即使目录不变,也禁止访问网站