![](/img/trans.png)
[英]Clear access share locks on postgres relations after select query
[英]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.