【问题标题】:Advisory locks scope in postgresql咨询锁定 postgresql 中的范围
【发布时间】:2017-11-06 22:39:27
【问题描述】:

我是 postgresql 新手,并试图了解咨询锁。我有以下两种情况:

  1. 在两个不同的会话中使用不同的数据库:(按预期方式工作)

    会话1:SELECT pg_advisory_lock(1);成功获取锁

    Session 2(注意不同数据库):SELECT pg_advisory_lock(1);成功获取锁

  2. 在同一个数据库中使用不同的架构:当我执行相同的操作时,第二个“会话”阻塞。

似乎建议锁在数据库级别而不是(数据库和模式)组合上运行。我的假设是正确的还是我遗漏了什么?

【问题讨论】:

  • "而不是(数据库和模式)" --- 您没有在查询中的任何地方指定模式。假设这是真的,它怎么知道获取锁的模式是什么?
  • 它们具有与常规锁相同的“范围”:每个数据库

标签: postgresql


【解决方案1】:

在 postgres 模式中是一个命名空间。不仅仅是一个前缀,但比另一个数据库少。在你的情况下,第二个会话不是“阻塞”,而是等待per docs

如果另一个会话已经持有同一资源的锁 标识符,此函数将等待直到资源变为 可用。

关于成功锁定不同数据库: 运行后SELECT pg_advisory_lock(1); 结帐pg_lockscolumn objid

锁定目标在其系统目录中的 OID,如果 target 不是一般的数据库对象

所以这个数字是每个数据库的 - 您可以为许多数据库引用相同的 1 - 这些将是不同的 OID。

【讨论】: