У меня есть таблица, похожая на список URL-адресов, которые я хочу посетить.На таблицу не ссылаются и не ссылаются на другие таблицы.Что мое приложение делает:
- выбирает несколько строк из списка URL
- запускает цикл по ним
- запускает транзакцию
- посещениеURL
- уточните его
- запустите суб-транзакцию
- проверьте, есть ли результаты уже в первых двух таблицах (выберите)
- , если нет,сохранить (вставить)
- зафиксировать суб-транзакцию
- запустить суб-транзакцию
- проверить, есть ли результаты уже в другой таблице (выберите)
- , если нет, сохраните его (вставьте)
- совершите суб-транзакцию
- обновите строку, которую я посещаю
- совершить основную транзакцию
- завершить цикл
Существует множество проверок ошибок, основная транзакция имеет сотни запросов (выберите и вставьте) mysql очень сильно нагружает процессор (я думаю, из-за большого журнала отката), но все это работает нормально.
Только я не могу запустить более одного экземпляраэтого пакета, потому что выбранные строки более или менее одинаковы: это означает, что я посещаю URL-адрес более одного раза в несколько секунд, что мне не нужно.
Если я перемещаю начало основноготранзакции вне цикла и выбора строк для обновления, но я не получаю мульти-параллелизм, потому что второй экземпляр не будет запускать выборку, пока основная транзакция первого экземпляра не будет зафиксирована.
ВозможноРешение состоит в том, чтобы добавить «заблокированное» поле к первой таблице, которая будет установлена в истинное значение (фактически к текущей дате, поскольку я стараюсь не использовать логические значения).
Другой вариант - запустить основную транзакцию, а затем выбрать только одну.строка (для обновления) сразу (установив «предел 1» вместо 5 или 10 на данный момент).
Я не могу представить другой способ получить то, что я хочу: не выбирать заблокированные строки.
Есть идеи?