0

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

选择 pg_advisory_xact_lock(123456)

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

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

我可以在不编写 plv8 扩展的情况下实现这一点吗?有任何想法吗?

我正在使用 PostgreSQL 10。

4

1 回答 1

2

在 5 个不同的锁 ID(例如 123457 到 123461)上循环“pg_try_advisory_xact_lock(...)”(1 个真正的锁持有者和另外 4 个非持有服务员 = 5)。获得其中一个然后授予您等待“真实”锁定ID的权利。未能获得5个中的任何一个都会导致失败。这确实意味着您必须保留/协调 6 个魔术常数,而不是 1 个。

于 2019-12-03T17:59:43.043 回答