如何在postgresql中使用咨询锁时避免死锁

我在postgres中使用pg_advisory_lock函数,如果它无法锁定特定键,则会阻塞/等待.我想知道是否有某种方法可以暂停这个?我看不到任何东西.如果没有,会话是否有办法强制释放由不同会话获得的锁?

谢谢!

最佳答案 如果您根本不想阻止,可以拨打
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;
点赞