gpt4 book ai didi

mysql - 如何处理对 mysql 的多线程请求以获得空闲行?

转载 作者:行者123 更新时间:2023-11-29 02:56:05 24 4
gpt4 key购买 nike

假设您有一个包含 10 万个作业的表,其中每个作业都需要处理。

job_id (int)
job_details (whatever)
job_status (Enum: Not processed, Processing, Processed)

我的核心软件例如有 100 个线程处理这些作业,所以每个线程都需要一个作业来处理,它得到一个免费的作业,所以它查询一个 Not Processed 作业,将其标记为 Processing 并在完成后将其标记为Processed

问题是当 100 个线程开始工作时,因为很多线程在查询时一起启动 Select * from jobs where job_status='Not processed' limit 1 update jobs set job_status=' processing' where job_id=%JOB_ID% 他们中的很多人得到相同的工作来处理!这是非常错误的。

我怎样才能正确地做到这一点?

最佳答案

如果 jobs 是 InnoDB 表,那么您可以使用 SELECT ... FOR UPDATE在事务中分配单个作业:

BEGIN
SELECT * FROM jobs WHERE job_status = 'Not processed' LIMIT 1 FOR UPDATE
UPDATE jobs SET job_status = 'Processing' WHERE job_id = ?
COMMIT

指定 FOR UPDATE 锁定选定的行。同样执行 SELECT 查询的独立事务(线程)将等待第一个事务完成。

或者,如果您修改jobs 表以记录哪个线程已分配任务,那么您可以在没有事务的情况下执行分配。首先,分配一个作业,将作业的 owner_thread 属性设置为执行线程唯一的某个标识符:

UPDATE jobs 
SET job_status = 'Processing', owner_thread = ?
WHERE job_status = 'Not processed'
LIMIT 1

然后使用执行线程的唯一标识符检索已分配作业的详细信息:

SELECT job_id, job_details FROM jobs WHERE owner_thread = ?

关于mysql - 如何处理对 mysql 的多线程请求以获得空闲行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30546427/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com