我正在尝试使用此 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/