Postgres Write/Read Lock



我有多线程JEE应用程序运行SELECT FOR UPDATE LIMIT 1;在有WHERE子句的表上查询,并在每个事务中更新行,这样可以创建行级写锁,并且不会阻塞读取器。

是否有办法配置postgres,以阻止读者读取行写锁?

在postgres 9.5+上有SKIP LOCKED选项:

如果你需要从一个表中SELECT,并且保护这些行不被更新,直到你的事务完成,你可以指定FOR UPDATE,但是如果一些行被锁定,你可以指定SKIP locked来告诉它忽略这些行,只对它可以访问的行执行操作。

https://wiki.postgresql.org/wiki/What 's_new_in_PostgreSQL_9.5 # SKIP_LOCKED

如果您正在运行Postgres <=9.4,其中NOWAIT存在,但SKIP LOCKED。这演示了在LOOP中使用CONTINUEEXIT,以确定下一个可用的未锁定单行。

DO $$
DECLARE 
    r RECORD;
    ... -- your variables 
BEGIN
    FOR r IN 
        SELECT some_id
          FROM some_table
         WHERE ... -- your conditions
         ORDER BY ... -- your ordering
         LIMIT ... -- your limit
    LOOP 
        BEGIN 
            SELECT ... -- your needed column(s)
              INTO ... -- your defined variable(s)
              FROM some_table -- the same table
             WHERE some_id = r.some_id -- only check this one record
               FOR UPDATE NOWAIT; -- don't wait for parallel transactions
            EXIT;
        EXCEPTION WHEN lock_not_available THEN 
            CONTINUE;
        END;
    END LOOP;
    ... -- do something based on variables, or move this before the EXIT above
END;
$$ LANGUAGE plpgsql;

最新更新