我想一定有一些基本的东西我不理解关于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条答案
按热度按时间q1qsirdb1#
如果您尝试从两个不同的PostgreSQL会话中执行此操作会怎么样?
查看更多文档。
9nvpjoqh2#
我对咨询锁的第一印象是类似的。我期望第二个查询(SELECT pg_tryadvisory_lock(20))也返回false(因为第一个查询得到了锁)。但是这个查询只确认了值为20的bigInt有锁。解释取决于用户。
将建议锁想象成一个表,您可以在其中存储一个值并获取该值的锁(通常是BigInt)。它没有明确的锁,没有事务会被延迟。这取决于你如何解释和使用结果-它不是阻塞。
我在我的项目中使用了两个整数选项。SELECT pg_try_advisory_lock(classId,objId),而两个参数都是整数。
要让它在多个表中工作,只需使用表的ID作为classId,主ID(这里是17)作为objId:
SELECT pg_try_advisory_lock((SELECT 'first_table'::regclass::oid)::integer, 17);
在这个例子中,“first_table”是表的名称,第二个整数是主键id(这里:17)。
使用bigInt作为参数(而不是上面描述的2个整数)允许更大范围的id,但是如果您将它与“second_table”一起使用,那么id 17也会被锁定(因为您锁定的是数字“17”,而不是与表中特定行的关系)。
我花了一些时间才弄清楚,所以希望它有助于理解咨询锁的内部工作原理。