【问题标题】:PostgreSQL concurrent update selectsPostgreSQL 并发更新选择
【发布时间】:2013-09-25 02:35:37
【问题描述】:

我正在尝试为作业队列进行某种更新选择。我需要它来支持影响同一个表或数据库的并发进程该服务器将仅用于队列,因此每个队列的数据库是可以接受的。最初我在考虑类似以下的事情:

UPDATE state=1,ts=NOW() FROM queue WHERE ID IN (SELECT ID FROM queue WHERE state=0 LIMIT X) RETURN *

我读到这会导致竞争条件,我读到有一个选项可以让 SELECT 子查询使用 FOR UPDATE,但是这将锁定行并且并发调用将在我不介意的地方被阻止如果他们跳到下一个未锁定的行。

所以我要求的是在 postgres 中拥有一个需要最少锁定整个数据库的 fifo 系统的最佳方式。

【问题讨论】:

    标签: postgresql concurrency queue delayed-job job-scheduling


    【解决方案1】:

    执行此操作的典型方法是将其包装在 PLPGSQL 函数中,选择 FOR UPDATE NOWAIT,然后使用异常处理跳过锁定的行。

    这确实会给函数带来一些额外的开销,因为即使没有异常,异常处理也需要额外的处理器周期来管理。

    举个很简单的例子:

     CREATE OR REPLACE FUNCTION get_all_unlocked_customers() RETURNS SETOF customer
     LANGUAGE PLPGSQL AS
     $$
     RETURN QUERY SELECT * FROM customer FOR UPDATE NOWAIT;
     EXCEPTION
        WHEN LOCK_NOT_AVAILABLE THEN
        -- NO NEED TO DO ANYTHING
        END;
     END;
     $$;
    

    【讨论】:

      猜你喜欢
      • 2020-01-11
      • 1970-01-01
      • 2014-03-30
      • 1970-01-01
      • 2017-03-31
      • 2018-09-22
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多