如何使用Postgres的行级锁定更新表中的随机4行?

时间:2017-02-06 08:44:55

标签: postgresql locking

我们计划在Postgres中使用一个没有引用的简单平面表作为事务数据存储。该表不断从不同的线程更新。我们需要从表中选择最多4个最小1行,锁定它,在状态字段上执行更新并释放锁定。理想情况下,这应该是并发查询不会相互阻塞的方式,每个查询都可以修改自己的行集。

阅读文档后,我想我可以用:

SELECT user_id FROM rooms LIMIT 1 INTO local_user_id 
WHERE user_status=0 FOR UPDATE;

UPDATE rooms  SET user_status = 1 
WHERE user_id = local_user_id;

但是,我需要在当时更新1-4个用户,将所有最多4个用户捆绑到一个事务中会将事务数量减少到1/4最佳情况(假设大多数选择结果在4个用户中) 。用Postgres 9.6解决这个问题的惯用方法是什么?

UPDATE1:

我在这里尝试实现的是一个类似于行为的队列,每个线程获取一些项目并处理这些项目,而其他线程可以愉快地从其余行读取并以并行和并行方式处理其他4行。

1 个答案:

答案 0 :(得分:2)

您可以将选定的ID存储在数组中:

WITH x AS (
       SELECT user_id
         FROM rooms
        WHERE user_status=0
        ORDER BY random()
        LIMIT 4
          FOR UPDATE
)
SELECT array_agg(user_id) FROM x;

在一次查询或单独更新之后。