2016-12-19 173 views
3

我在postgres中使用pg_advisory_lock函數,如果它無法獲取特定密鑰上的鎖,則會阻止/等待。我想知道是否有某種方法可以讓此超時?我找不到任何我看過的東西。如果沒有,會話是否有辦法強制釋放由不同會話獲得的鎖定?如何在postgresql中使用諮詢鎖時避免死鎖

謝謝!

+0

您與我們的Postgres諮詢鎖無內置超時功能的僵局。請參閱[postgresql中的諮詢鎖超時](https://stackoverflow.com/q/38853470/642706)。 –

回答

2

如果你根本不想阻止,你可以撥打pg_try_advisory_lock()

如果阻塞pg_advisory_lock()調用會導致死鎖,它會在deadlock_timeout設置指定的時間間隔(默認爲1秒)之後自動超時。您還可以通過設置lock_timeout(默認情況下禁用)來限制鎖定等待時間 - 死鎖或不鎖定。

注意,觸發這兩種超時會引發錯誤,因此它可以包裹在一個功能處理的錯誤,例如有用:

CREATE FUNCTION pg_try_advisory_lock_with_timeout(key bigint) RETURNS boolean 
SET lock_timeout TO '1s' 
AS $$ 
BEGIN 
    PERFORM pg_advisory_lock(key); 
    RETURN true; 
EXCEPTION 
    WHEN lock_not_available OR deadlock_detected THEN 
    RETURN false; 
END; 
$$ 
LANGUAGE plpgsql; 
0

您可以嘗試idle_in_transaction_session_timeout

終止任何會話,其中一個空閒的事務處於空閒狀態 長於指定的持續時間(以毫秒爲單位)。此允許釋放該會話保留的任何 鎖,並將連接插槽重新用於 ;它還允許元組僅對該事務處理可見的元組 。有關這方面的更多細節,請參見第24.1節。

假設你運行任務A - >設置鎖定資源X,並設置idle_in_transaction_session_timeout = 1秒 - >如果任務A空閒> 1秒,那麼任務A自動終止,鎖定X被自動釋放。然後任務B可以得到鎖定X.

通過這種方式,可以避免資源X.