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



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

选择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 个。

相关内容

  • 没有找到相关文章

最新更新