我认为必须有一些基本的东西,我不了解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
所以我想我的问题是,如何以一种阻止它再次获得的方式获得咨询锁?
答案 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”而不是与特定行的关系)一张桌子。)
我花了一些时间才弄清楚这一点,所以希望它有助于理解咨询锁的内部运作。