我正在并行运行许多网络爬虫实例。
每个爬虫从表中选择一个域,将该 URL 和开始时间插入到日志表中,然后开始爬取该域。
其他并行爬虫在选择自己的要爬取的域之前检查日志表以查看哪些域已经被爬取。
我需要防止其他爬虫选择一个刚刚被另一个爬虫选择但还没有日志条目的域。我对如何做到这一点的最佳猜测是在一个爬虫选择一个域并在日志表中插入一行(两个查询)时锁定数据库以防止所有其他读/写操作。
到底是怎么做到的?恐怕这非常复杂,并且依赖于许多其他事情。请帮助我开始。
这段代码似乎是一个很好的解决方案(但是请参阅下面的错误):
INSERT INTO crawlLog (companyId, timeStartCrawling)
VALUES
(
(
SELECT companies.id FROM companies
LEFT OUTER JOIN crawlLog
ON companies.id = crawlLog.companyId
WHERE crawlLog.companyId IS NULL
LIMIT 1
),
now()
)
但我不断收到以下mysql错误:
You can't specify target table 'crawlLog' for update in FROM clause
有没有办法在没有这个问题的情况下完成同样的事情?我尝试了几种不同的方法。包括这个:
INSERT INTO crawlLog (companyId, timeStartCrawling)
VALUES
(
(
SELECT id
FROM companies
WHERE id NOT IN (SELECT companyId FROM crawlLog) LIMIT 1
),
now()
)