Sqlalchemy 显式锁定 Postgresql 表

And*_*rew 11 python postgresql locking sqlalchemy

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

db.engine.execute('BEGIN; LOCK TABLE database_version IN ACCESS EXCLUSIVE MODE;')
Run Code Online (Sandbox Code Playgroud)

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

select * from pg_catalog.pg_locks;
Run Code Online (Sandbox Code Playgroud)

不存在任何 ACCESS EXCLUSIVE 锁。

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

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

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

And*_*rew 9

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

db.session.begin_nested()
db.session.execute('LOCK TABLE database_version IN ACCESS EXCLUSIVE MODE;')
Run Code Online (Sandbox Code Playgroud)

然后,我插入新行:

new_version = DatabaseVersion(version=version + 1)
db.session.add(new_version)
db.session.commit()
Run Code Online (Sandbox Code Playgroud)

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

db.session.commit()
Run Code Online (Sandbox Code Playgroud)