gpt4 book ai didi

sql - PostgreSQL 在存储函数中获取并释放 LOCK

转载 作者:行者123 更新时间:2023-11-29 11:19:28 24 4
gpt4 key购买 nike

我有一个函数需要对多个大表执行长时间更新。在更新期间,一次需要在 EXCLUSIVE 模式下锁定 2-3 个表。

由于并非所有表都需要同时锁定,理想情况下我只想锁定我当时正在更新的那些表,然后在完成后删除锁定。

例如。

-- Lock first pair of tables
LOCK TABLE tbl1_a IN EXCLUSIVE MODE;
LOCK TABLE tbl1_b IN EXCLUSIVE MODE;

-- Perform the update on tbl1_a and tbl1_b

-- Release the locks on tbl1_a and tbl1_b
-- HOW???

-- Proceed to the next pair of tables
LOCK TABLE tbl2_a IN EXCLUSIVE MODE;
LOCK TABLE tbl2_b IN EXCLUSIVE MODE;

不幸的是,plpgsql 中没有与 UNLOCK 语句等效的语句。移除 LOCK 的正常方法是提交事务,但这在函数内部是不可能的。

有什么解决办法吗?在函数完成之前显式释放锁的某种方法?或者运行某种子事务(可能通过在单独的函数中运行每个更新)?

更新

我承认没有解决方案。我会将每个更新写入一个单独的函数并从数据库外部进行协调。谢谢大家。

最佳答案

Postgres 11 或更高版本中,考虑允许事务控制的 PROCEDURE。见:


有了函数没办法。 Postgres 中的函数是原子的(总是在事务中)并且锁在事务结束时释放。

您可以使用 advisory locks 来解决这个问题.但那些不是一回事。所有相互竞争的交易都必须一起进行。不知道咨询锁的并发访问会破坏聚会。

dba.SE 上的代码示例:

或者你可能会在某个地方使用 dblink 来“欺骗”自治事务:

或者您重新评估您的问题并将其拆分为几个单独的事务。

关于sql - PostgreSQL 在存储函数中获取并释放 LOCK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28994567/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com