我正在使用postgres中的pg_advisory_lock
函数,如果它无法锁定特定键,则会阻塞/等待。我想知道是否有某种方法可以暂停这个?我看不到任何东西。如果没有,会话是否有办法强制释放由不同会话获得的锁?
谢谢!
答案 0 :(得分:2)
如果您根本不想阻止,可以拨打pg_try_advisory_lock()
。
如果阻塞pg_advisory_lock()
调用确实导致死锁,它将在deadlock_timeout
设置指定的时间间隔后自动超时(默认为一秒)。您还可以通过设置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;
答案 1 :(得分:0)
您可以尝试 idle_in_transaction_session_timeout
终止任何已经闲置的开放交易的会话 超过指定的持续时间(以毫秒为单位)。这个允许任何 该会话持有的锁被释放和连接槽到 被重用;它还允许仅对此事务可见的元组 被吸尘。有关此内容的更多详细信息,请参见第24.1节。
假设您运行任务A - >设置锁资源X并设置idle_in_transaction_session_timeout = 1s - >如果任务A空闲> 1s,然后任务A自动终止,锁X自动释放。然后任务B可以得到锁X.
通过这种方式,您可以避免资源X的死锁。