我在 postgres 9.4.4 上无法正确获取 postgres 咨询锁的问题。如果我在两个屏幕上 ssh 进入 postgres 服务器并打开 psql 以获取一个锁定并尝试获取另一个锁定它可以完美地工作。但是,如果我从指向该服务器的另一台服务器执行此操作,我可以自由地“获取”锁,但它实际上从未从数据库中获取锁。
通常,我们使用 python 来获取锁,这就是我们最初注意到问题的地方。要手动获取锁,我正在使用select pg_advisory_lock(123456789);
检查当前正在使用的锁select objid from pg_locks where locktype = 'advisory';
我将在这里播放它,以便您可以直观地看到它并告诉我我在做什么。
尝试使用 app_server(使用 pgbouncer 的远程服务器)获取锁,但它失败了。
app_server> psql
app_server> \c mydb
app_server> select pg_advisory_lock(123456789);
pg_advisory_lock
------------------
(1 row)
app_server>select objid from pg_locks where locktype = 'advisory';
objid
-------
(0 rows)
使用 db_server 获取锁,然后尝试再次在 app_server(远程)上但在同一个数据库上获取锁。
db_server> psql
db_server> \c mydb
db_server> select pg_advisory_lock(123456789);
pg_advisory_lock
------------------
(1 row)
db_server> select objid from pg_locks where locktype = 'advisory';
objid
-----------
123456789
(1 row)
在这里您可以看到 db_server 有锁,所以我现在将返回 app_server 并尝试获取相同的锁,但这次它将按预期工作,它将等待来自 db_server 的解锁。
app_server> select pg_advisory_lock(123456789);
...
同时,我会从 db_server 去解锁它。
db_server> select pg_advisory_unlock(123456789);
立即 app_server 获取并释放锁。
servers> select objid from pg_locks where locktype = 'advisory';
objid
-------
(0 rows)