繁体   English   中英

获取postgres中的咨询锁

[英]Acquiring advisory locks in postgres

我认为必须有一些基本的东西,我不了解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个不同的PostgreSQL会话中执行此操作,该怎么办?

在文档中查看更多内容。

我对咨询锁的第一印象是类似的。 我期望第二个查询(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”而不是与表中特定行的关系) 。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM