簡體   English   中英

Postgres咨詢鎖無法正常工作

[英]Postgres Advisory Locks not working

我在postgres 9.4.4中沒有正確獲取postgres咨詢鎖的問題。 如果我在兩個屏幕上進入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)

問題是,當工作服務器在pgbouncer.ini中使用基於session的連接時,損壞的服務器使用基於transaction的連接到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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM