PostgreSQL:获得咨询锁,除非有超过 n 个事务在等待它

PostgreSQL: get advisory lock unless more than n transactions are waiting for it

我有一个从分布式客户端获取的资源。此资源受事务级锁保护:

SELECT pg_advisory_xact_lock(123456)

我知道如果我不想等待它免费,我可以使用 pg_try_advisory_xact_lock。如果我得到它 - 调用将 return true,否则 false.

我想要实现的是 pg_advisory_xact_lock 队列大小的行为。如果少于 4 个事务正在等待锁,则将它们加入等待,否则 return false pg_try_advisory_xact_lock 否则。如果您设法获得锁 - return true.

不写plv8扩展能实现吗?有什么想法吗?

我正在使用 PostgreSQL 10。

在 5 个不同的锁 ID(比如 123457 到 123461)上循环 "pg_try_advisory_xact_lock(...)"(1 个真正的锁持有者和另外 4 个非持有锁的等待者 = 5)。获得其中之一然后授予您等待 "real" 锁 ID 的权利。未能获得 5 个结果中的任何一个失败。这确实意味着您必须 reserve/coordinate 6 个魔法常量,而不是 1 个。