我有一个包含需要处理任务的“jobs”表。
一组工作人员可以使用像
但是我需要锁定由单个工作者链接的所有行。
类似这样的查询
如果使用子查询
而将“人”行在“persons”表中锁定,而不是在作业中进行锁定,不是首选解决方案,因为其他进程也要使用此表。
请建议是否有一种简单的方法来实现此功能。
一组工作人员可以使用像
SELECT * FROM jobs WHERE status='new' LIMIT 1 FOR UPDATE SKIP LOCKED
这样简单的查询,逐个并行地处理行。但是我需要锁定由单个工作者链接的所有行。
类似这样的查询
SELECT * FROM jobs WHERE status='new' GROUP BY person_id LIMIT 1 FOR UPDATE SKIP LOCKED
可以完成该任务,但聚合函数无法使用锁定。如果使用子查询
SELECT * FROM jobs WHERE person_id in (SELECT person_id FROM jobs WHERE status='new' LIMIT 1 FOR UPDATE SKIP LOCKED) FOR UPDATE SKIP LOCKED
,我无法保证所有行都会被同一线程锁定。而将“人”行在“persons”表中锁定,而不是在作业中进行锁定,不是首选解决方案,因为其他进程也要使用此表。
请建议是否有一种简单的方法来实现此功能。