Я запускаю много экземпляров веб-браузера параллельно.
Каждый искатель выбирает домен из таблицы, вставляет этот 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()
)