我有一个包含需要处理的任务的'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
的情况下,我不能保证所有行都会被相同的线程锁定。
锁定'person‘表中的’person‘行,而不是job,这不是一个可取的解决方案,因为这个表也被其他进程使用。
如果有简单的方法,请指教。
发布于 2020-11-29 07:49:12
您可以使用advisory locks来以独占方式锁定"person“实体。
https://stackoverflow.com/questions/65055437
复制相似问题