Запретить выделение той же строки в mySQL

Передо мной была поставлена ​​задача создать «Mass Crawler», который полностью полагается на прокси внутри базы данных. Вот простой обзор того, чего я пытаюсь достичь:

  • 1 x CronJob Bootstrap file — это файл, который отправляет 50 параллелей локон запросы к отдельный гусеничный файл
  • 1 х Индивидуальный файл Crawler — это должно захватить УНИКАЛЬНАЯ строка (прокси) из базы данных, которую другой процесс не выбрал.

Я посмотрел в TRANSACTIONS с MySQL, но я все еще верю, что это не поможет, так как запрос будет выполняться в одно и то же время для каждого отдельного процесса сканера.

Вот идея, которая возникла у меня в голове для отдельного файла сканера:

$db = new MysqliDb("localhost", "username", "password", "database");

$db->connect();
$db->startTransaction();
$db->where("last_used", array("<" => "DATE_SUB(NOW(),INTERVAL 30 SECOND)"));
$proxies = $db->get("proxies", 1);
if(count($proxies) == 1) {

//complete any scraping that needs to be done

//update the database to say the proxy has just been used
$db->where("id", $accounts[0]['id']);
$db->update("proxies", array("last_used", date("Y-m-d H:i:s")));

//commit the complete transaction
$db->commit();
}
$db->disconnect();

Будет ли приведенный выше пример правильным способом использовать MySQL? TRANSACTION особенность и заверить ВСЕ параллельными запросами выделены разные строки?

1

Решение

Вам нужен столбец в таблице, который указывает, что строка используется одним из процессов искателя. Ты первый SELECT надо искать WHERE in_use = 0; он должен использовать FOR UPDATE предложение для блокировки строк, которые обрабатываются, хотя.

SELECT *
FROM proxies
WHERE in_use = 0
LIMIT 1
FOR UPDATE;

Я не знаю, как написать этот запрос с помощью API БД, который вы используете; вам может понадобиться использовать его функцию для выполнения необработанных запросов.

Затем обновляет эту строку до SET in_use = 1, Выполняя обе операции в транзакции, вы гарантируете, что никакой другой процесс не получит эту строку.

Когда обработка строки завершена, она может SET in_use = 0,

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]