这是我正在尝试做的伪代码:
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
我怎样才能使这件作品成为原子交易?