我在postgres中使用pg_advisory_lock
函数,如果它无法获取特定密钥上的锁,则会阻止/等待。我想知道是否有某种方法可以让此超时?我找不到任何我看过的东西。如果没有,会话是否有办法强制释放由不同会话获得的锁定?如何在postgresql中使用咨询锁时避免死锁
谢谢!
我在postgres中使用pg_advisory_lock
函数,如果它无法获取特定密钥上的锁,则会阻止/等待。我想知道是否有某种方法可以让此超时?我找不到任何我看过的东西。如果没有,会话是否有办法强制释放由不同会话获得的锁定?如何在postgresql中使用咨询锁时避免死锁
谢谢!
如果你根本不想阻止,你可以拨打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;
您可以尝试idle_in_transaction_session_timeout
终止任何会话,其中一个空闲的事务处于空闲状态 长于指定的持续时间(以毫秒为单位)。此允许释放该会话保留的任何 锁,并将连接插槽重新用于 ;它还允许元组仅对该事务处理可见的元组 。有关这方面的更多细节,请参见第24.1节。
假设你运行任务A - >设置锁定资源X,并设置idle_in_transaction_session_timeout = 1秒 - >如果任务A空闲> 1秒,那么任务A自动终止,锁定X被自动释放。然后任务B可以得到锁定X.
通过这种方式,可以避免资源X.
您与我们的Postgres咨询锁无内置超时功能的僵局。请参阅[postgresql中的咨询锁超时](https://stackoverflow.com/q/38853470/642706)。 –