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