在SELECT中嵌入pg_advisory_lock与显式使用另一个语句有什么好处?

时间:2017-09-13 21:08:31

标签: sql postgresql

我无法理解https://www.postgresql.org/docs/9.1/static/explicit-locking.html

中的示例

他们将锁与SELECT子句一起嵌入 SELECT pg_advisory_lock(id) FROM foo WHERE id = 12345; -- ok

FOO中选择什么?如果它像

,我会更好理解
SELECT pg_advisory_lock(123); //lock
SELECT * FROM foo WHERE id = 12345;

它显式锁定块。我似乎无法找到解释如何在任何地方真正使用咨询锁定来解释嵌入和明确地在其自己的陈述之间的差异。

1 个答案:

答案 0 :(得分:2)

执行SELECT pg_advisory_lock(123);会在123上创建一个锁,无论它是否为有效值。仅当表foo中存在ID 123的条目时,执行SELECT pg_advisory_lock(id) FROM foo WHERE id = 123;才会创建锁。

让我们注意pg_locks doc中找到的行:

  

键的实际含义取决于用户

这往往意味着select / from / where语法用于将锁定与现有行相关联,而单独的select语法用于更广泛的含义,例如应用程序范围的锁定。