我有一个从分布式客户端获取的资源。此资源受事务级别锁保护:
选择pg_advisory_xact_lock(123456(
我知道如果我不想等待它免费,我可以使用它pg_try_advisory_xact_lock
。如果我得到它 - 电话将返回true
,否则false
.
我想要实现的是队列大小的pg_advisory_xact_lock
的行为。如果少于 4 个事务正在等待锁,则将它们加入等待,否则返回 falsepg_try_advisory_xact_lock
否则。如果您设法获得锁 - 返回 true。
我可以在不编写 plv8 扩展的情况下实现这一点吗?有什么想法吗?
我正在使用PostgreSQL 10。
在 5 个不同的锁 ID 上循环浏览"pg_try_advisory_xact_lock(...("(比如 123457 到 123461((1 个真正的锁持有人和 4 个非持有服务员 = 5(。 然后获得其中一个,然后授予您等待"真实"锁定ID的权利。 未能获得 5 个中的任何一个都会导致失败。 这意味着您必须保留/协调 6 个魔术常数,而不是 1 个。