mysql, блокирующие строки в запросе выбора для обновления

Итак, я пишу простой поисковый робот для обслуживания собственных сайтов. Он будет проходить по каждой ссылке, добавляя новые ссылки по мере их нахождения, отмечая теги 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 для пометить поле как просканированное перед его обработкой, но тот факт, что это не является бесшовным, кажется причиной проблемы. Мне нужен способ беспрепятственно ВЫБРАТЬ и ОБНОВИТЬ поле или ВЫБРАТЬ и остановить его повторное выделение, пока я не скажу об этом.

5
задан Horse 12 August 2011 в 08:53
поделиться