我在 MySQL InnoDB 表中有一个巨大的 URL 列表,以及查询 MySQL 以获取一组要处理的 URL 的工作进程。URL 应立即标记为正在处理,以便其他工作进程不会因为开始处理相同的工作进程而浪费资源。
目前我首先这样做是为了获取一些 URL:
SELECT DISTINCT url FROM urls WHERE task_assigned is NULL ORDER BY id LIMIT 100
然后在代码中,我天真地遍历每个 URL 以将其标记为正在处理:
UPDATE urls SET task_assigned = NOW() WHERE url = ? COLLATE utf8_bin
我非常清楚这是多么愚蠢和低效。更重要的是,不能保证另一个工作进程不会尝试在我的 UPDATE 中间获取列表。这样做的美丽方法是什么?我是否应该进行交易,如何?