我有一个包含需要处理的任务的"jobs"表。
一组工作人员可以使用像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"表中的"person"行而不是作业不是一个更好的解决方案,因为其他进程也在使用此表。
如果有一个简单的方法可以做到这一点,请提供建议。
您可以使用顾问锁来独占锁定一个"人;实体