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

Zan*_*nko 4 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;
Run Code Online (Sandbox Code Playgroud)

它明确锁定块的地方。我似乎无法在任何地方找到关于如何真正使用咨询锁的解释来解释 Embedding 和 Explicitly 之间的区别。

JGH*_*JGH 5

这样做SELECT pg_advisory_lock(123);会在 上创建一个锁123,无论它是否是一个有效的值。这样做SELECT pg_advisory_lock(id) FROM foo WHERE id = 123;只是如果在表foo的ID 123的条目将创建锁。

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

按键的实际含义由用户决定

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