Итак, я пишу простой поисковый робот для обслуживания собственных сайтов. Он будет проходить по каждой ссылке, добавляя новые ссылки по мере их нахождения, отмечая теги title и h1 и т. Д.
Иногда он дублирует заголовки и теги H1, когда в источнике есть только один, когда я проверяю его вручную.
] Причина, по которой это происходит, заключается в том, что скрипт сканирования выполняется через cron и кажется, что он перекрывается, поэтому одна и та же страница обрабатывается дважды.
Сценарий в основном захватывает страницу, которая не просканирована, а затем, если ответ http 200, он пометит его как просканированный и обработает то, что ему нужно.
Итак, где-то между SELECT и UPDATE, другой поток скрипта выполняется в той же строке, которая была выбрана.
Есть ли способ сделать это. либо SELECT и UPDATE в том же запросе, либо заблокировать строку, возвращаемую в SELECT, чтобы ее нельзя было вернуть снова в другом запросе в другом потоке, пока я не закончу с ней?
Вы смотрели - http: //dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html и общий материал SELECT FOR UPDATE, но я все еще не уверен.
Править
Я использую что-то вроде этого
START TRANSACTION;
SELECT .. FOR UPDATE;
UPDATE .... ;
COMMIT;
Но мне это не нравится. Я по умолчанию использую InnoDB для этой таблицы. Я думаю, это может быть не путь вперед,поскольку он просто откладывает обработку строки до момента фиксации, когда я хочу, чтобы он физически не мог снова выбрать строку.
Я закрыл это, выполнив SELECT, а затем выполнив UPDATE для пометить поле как просканированное перед его обработкой, но тот факт, что это не является бесшовным, кажется причиной проблемы. Мне нужен способ беспрепятственно ВЫБРАТЬ и ОБНОВИТЬ поле или ВЫБРАТЬ и остановить его повторное выделение, пока я не скажу об этом.