繁体   English   中英

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

[英]How to avoid dead lock while using advisory locks in 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;

您可以尝试idle_in_transaction_session_timeout

使用空闲时间超过指定持续时间(以毫秒为单位)的打开事务终止任何会话。 允许释放该会话持有的任何锁,并重新使用连接槽; 它还允许仅对此事务可见的元组进行清理。 有关详细信息,请参见第24.1节。

假设你运行任务A - >设置锁资源X并设置idle_in_transaction_session_timeout = 1s - >如果任务A空闲> 1s,则任务A自动终止并且锁X自动释放。 然后任务B可以获得锁X.

通过这种方式,您可以避免资源X的死锁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM