Postgres咨询锁无法正常工作

时间:2015-10-30 19:59:51

标签: python postgresql locking psql pgbouncer

我遇到postgres咨询锁没有在postgres 9.4.4上正确获取的问题。如果我在两个屏幕上进入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)

1 个答案:

答案 0 :(得分:3)

问题在于,当工作服务器在transaction中使用基于session的连接时,损坏的服务器正在使用基于pgbouncer.ini的连接到postgres。我们最初看看ini时不确定这是怎么错过的。

; When server connection is released back to pool:
;   session      - after client disconnects
;   transaction  - after transaction finishes
;   statement    - after statement finishes
pool_mode = session