我正在并行运行许多个网络爬虫实例。每个爬虫从表格中选择一个域名,将该网址和开始时间插入到日志表中,然后开始爬取该域名。其他并行爬虫在选择要爬取的域名之前检查日志表以查看哪些域名已经在被爬取。我需要防止其他爬虫选择刚被另一个爬虫选择但尚未在日志中有条目的域名。我最好的猜测是,在一个爬虫选择一个域并在日志表中插入一行记录(两个查询)时,从所有其他读取/写入中锁定数据库。如何做到这一点?我担心这非常复杂,依赖于许多其他因素。请帮助我入门。
下面的代码似乎是一个很好的解决方案(见下面的错误)。
但是我一直收到以下mysql错误:
有没有一种方法可以在不出现这个问题的情况下完成相同的事情?我尝试了几种不同的方法,包括这个:
下面的代码似乎是一个很好的解决方案(见下面的错误)。
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()
)