【发布时间】:2016-10-26 10:47:36
【问题描述】:
这是我正在尝试做的伪代码:
rate_count = SELECT COUNT(id) FROM job WHERE last_processed_at >= ?
current_limit = rate_limit - rate_count
if current_limit > 0
UPDATE job SET state='processing'
WHERE id IN(
SELECT id FROM job
WHERE state='pending'
LIMIT :current_limit
)
除了并发问题外,我都可以正常工作。当同时从多个会话运行时,两个会话都选择并因此更新相同的东西:(
我可以通过在它的 SELECT 子查询中添加 FOR UPDATE 来获得第二个原子查询。但我无法将 FOR UPDATE 添加到第一个查询中,因为聚合函数不允许使用 FOR UPDATE
我怎样才能使这部分成为原子事务?
【问题讨论】:
-
select for update .. skip locked: blog.2ndquadrant.com/… -
@a_horse_with_no_name 这看起来很有希望!
-
@a_horse_with_no_name 这根本无助于解决我的问题,它只是让 FOR UPDATE 更加优化,但无论如何感谢
标签: sql postgresql select-for-update