我有一个表,它是一个任务队列,每个任务都需要独占访问多个资源。我希望我的查询选择一个不需要其他类似会话声称的资源的单个任务。
如果每个任务都必须在一个资源上工作,我会写这样的东西:
select *
from tasks t
inner join resources r
on r.id = t.resource_id
order by t.submitted_ts
limit 1
for update skip locked
但是由于我有多个资源,我不得不以某种方式将它们全部锁定:
select *
from tasks t
inner join task_details td
on t.id = td.task_id
inner join resources r
on r.id = td.resource_id
order by t.submitted_ts, t.id
limit ???
for update skip locked
我不能限制为 1,因为我需要锁定resources
.
在我看来,我也应该尝试锁定的所有行resources
,所以一定不是skip locked
,而是nowait
为了资源和skip locked
为了tasks
.