我是postgresql的新手,并试图了解咨询锁。我有以下两种情况:
在两个不同的会话中使用不同的数据库:(以预期的方式工作)
第1节:SELECT pg_advisory_lock(1);
成功获取锁
会话2(在不同的数据库中注释):SELECT pg_advisory_lock(1);
成功获取锁
在同一个数据库中使用不同的模式:当我执行相同的操作时,第二个“会话”阻止。
咨询锁似乎在数据库级别而不是(数据库和架构)组合中运行。我的假设是正确的还是我遗失了什么?
答案 0 :(得分:1)
在postgres架构中是命名空间。不仅仅是一个前缀,还不到另一个数据库。在你的情况下,第二个会话不是"阻止",而是等待per docs:
如果另一个会话已经锁定了同一个资源 标识符,此函数将等待资源变为 可用。
关于在不同数据库上成功锁定:
运行SELECT pg_advisory_lock(1);
结帐pg_locks
,column objid
系统目录中锁定目标的OID,如果是,则为null target不是通用数据库对象
所以这个数字是每个数据库 - 你可以为许多数据库引用相同的 1 - 那些将是不同的OID。