获取postgres中的咨询锁

时间:2012-04-23 14:40:43

标签: postgresql locking

我认为必须有一些基本的东西,我不了解postgres中的咨询锁定。如果我在psql命令行客户端上输入以下命令,则该函数两次都返回true:

SELECT pg_try_advisory_lock(20); --> true
SELECT pg_try_advisory_lock(20); --> true

我原以为第二个命令应该返回false,因为应该已经获取了锁。奇怪的是,我确实得到了以下内容,表明已经获得了两次锁定:

SELECT pg_advisory_unlock(20); --> true
SELECT pg_advisory_unlock(20); --> true
SELECT pg_advisory_unlock(20); --> false

所以我想我的问题是,如何以一种阻止它再次获得的方式获得咨询锁?

2 个答案:

答案 0 :(得分:12)

如果您尝试从2个不同的PostgreSQL会话中执行此操作会怎么样?

查看更多in the docs

答案 1 :(得分:3)

我对咨询锁的第一印象是类似的。我期望第二个查询(SELECT pg_tryadvisory_lock(20))也返回false(因为第一个得到了锁)。但是此查询仅确认值为20的bigInt具有锁定。解释取决于用户。

想象一下,建议锁定为一个表,您可以在其中存储值并锁定该值(通常是BigInt)。没有明确的锁定,也不会延迟转换。这取决于你如何解释和使用结果 - 而且它不会阻塞。

我在带有两个整数选项的项目中使用它。 SELECT pg_try_advisory_lock(classId,objId),而两个参数都是整数。

要使其不仅仅使用表,只需将表的OID用作classId,将主要ID(此处为17)用作objId:

SELECT pg_try_advisory_lock((SELECT 'first_table'::regclass::oid)::integer, 17);

在此示例中,“first_table”是表的名称,第二个整数是主键ID(此处:17)。

使用bigInt作为参数允许更广泛的id,但是如果你使用“second_table”而不是id 17也被锁定(因为你锁定了数字“17”而不是与特定行的关系)一张桌子。)

我花了一些时间才弄清楚这一点,所以希望它有助于理解咨询锁的内部运作。