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 个。
我有一个从分布式客户端获取的资源。此资源受事务级锁保护:
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 个。