python - Postgresql 表的 SQLalchemy 显式锁定

标签 python postgresql sqlalchemy locking

我正在尝试使用此 sqlalchemy 命令显式锁定 postgres 表:

db.engine.execute('BEGIN; LOCK TABLE database_version IN ACCESS EXCLUSIVE MODE;')

执行后,如果我进入数据库客户端并运行:

select * from pg_catalog.pg_locks;

不存在任何 ACCESS EXCLUSIVE 锁。

如果相反,我运行第一个命令,但从数据库客户端内部,它按预期工作。

尝试从 sqlalchemy 获取表锁是否无法正常工作是否有原因?

理想情况下,我希望一次只有一个进程能够查询和插入 database_version 表。

最佳答案

所以事实证明,我需要从 session 对象开始一个嵌套事务,而不是尝试使用直接 SQL 来BEGIN一个。

db.session.begin_nested()
db.session.execute('LOCK TABLE database_version IN ACCESS EXCLUSIVE MODE;')

然后,我插入新行:

new_version = DatabaseVersion(version=version + 1)
db.session.add(new_version)
db.session.commit()

然后最后再次提交以关闭嵌套事务:

db.session.commit()

关于python - Postgresql 表的 SQLalchemy 显式锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37331646/

相关文章:

Postgresql - 如何按特定列选择多个表并 append 它们

ruby-on-rails - 可以在创建或更新后自动重新加载实例吗?

sql - 将 SQL 中的日期范围分解为单独的 bool 日行

python - 如何调试 SQLAlchemy 查询的缓慢启动时间?

sqlalchemy:多重关系(通过关联对象实现多对多)

python - 如何将数据框中的所有对象类型值转换为 int

python - 将文本文件转换为字典

python - 以 h5py 对象作为实例变量的令人费解的赋值行为

python - Microsoft.Azure.WebJobs.Script : Architecture Arm64 is not supported for language python (issue on Mac M1 Chip)

python - 正则表达式模块 Python 中的 Posix 类