Блокировка таблицы PDO для таблицы не указана?

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

Я перенесу около 48 млн записей из таблицы 1 в таблицу 2, обе из InnoDB. Я в состоянии идентифицировать записи, которые должны быть отобраны из таблицы1 через user_id ("любая запись, введенная user_id=3, перемещается из таблицы1 в таблицу2"). У меня есть первый опыт работы с кодом в настройке одного экземпляра, который мне нужно расширить, чтобы иметь возможность запускать процесс миграции через сервер AMQP, чтобы я мог запускать работу от нескольких потребителей (т.е. я запускаю потребителей / задания параллельно в 2 экземплярах одного и того же задания одновременно) в циклическом режиме, когда все потребители работают одновременно. Я хотел бы иметь возможность масштабировать до 10-ти потребителей, чтобы быстро справиться с работой, иначе для выполнения работы потребуется около 15 дней.

Код выбирает самые старые 2000 записей, которые соответствуют критериям запроса за прогон. Проблема состоит в том, что если у меня есть 2 экземпляра кода, выполняющего и выбирающего записи, то instance1 собирается захватить идентификаторы 1-2000, а instance2, который запускается почти в одно и то же время, также собирается захватить 1-2000, поскольку instance1 не имеет закончил перемещение 0-2000 из таблицы1, и эти идентификаторы все еще будут присутствовать в таблице1.

Без проблем. Я добавляю контрольную таблицу, чтобы отметить, какие записи исключать - это позволяет instance1 сказать "У меня есть записи 1-2000", так что, когда instance2 запускается и отправляется на запрос, он говорит "какие идентификаторы я должен исключить?" основанный на запросе к контрольной таблице как части ее "дайте мне следующие 2000 записей", чтобы instance2 захватил идентификаторы 2001 до 4001, а затем обновил контрольную таблицу, чтобы сообщить, что instance2 имеет идентификаторы 2001 до 4001. Поэтому, если есть instance3 тогда он будет знать, чтобы пропустить идентификаторы от 1 до 4001, когда он запускается, запрашивая следующие 2k записей.

Когда экземпляр записывает запись в заблокированную управляющую таблицу, он записывает ее как "[first_id_found] и [last_id_found]" или "5671 и 7671". Я использую 'и', так как текст входит в предложение sql BETWEEN.

выберите идентификатор из таблицы 1, где идентификатор не между 1565 и 1567, а идентификатор не между 1568 и 1570, и созданный_бай = 3 порядка по идентификатору asc limit 0, 2000

Эта проблема:

Единственная таблица, в которой мне нужна блокировка, - это контрольная таблица, так что я уверен, что как только экземпляр получит доступ к контрольной таблице, он сможет найти записи, которые нужно пропустить, а также написать свою собственную запись пропуска, чтобы следующий экземпляр, который обращается к control После снятия блокировки таблица найдет актуальные данные.

Но мне нужно оставить замок на месте, пока запрос table1 заканчивается, и я могу определить первый и последний идентификатор в наборе результатов, чтобы я мог добавить их к control таблица, так что следующий запущенный экземпляр будет знать, что исключить.

Обратите внимание, что контрольный файл не является table1 ни table2и что я не уточняю table1 или же table2 поскольку мне не нужна блокировка ни для одной из них, ни для блокировки, потому что другие процессы обращаются к таблицам, и я не хочу препятствовать доступу других запущенных процессов к table1 или же table2,

поэтому код псевдо выглядит так:

// lock control table
// find all control table records (multiple workers = possible multiple records) indicating which id ranges to omit
// build "table1.id not between x and y" strings for each control record found
// query table1 with "not between" into array via PDO::fetchAll() to get the ids of N records that no other instance is working with  <<-- the problem
// find first and last ids in result set
// add control table record to `params` field with value = "[first_id_found] and [last_id_found]"
// unlock control table
// process array

Когда я запрашиваю table1, я не получаю никаких записей. Не правильно, у меня 48м записей. Проверка errorInfo() показывает мне состояние ошибки с:

"Таблица table1" не была заблокирована с помощью LOCK TABLES"

Я не хочу блокировать table1, тем не менее, он выглядит так, как будто его запросили после того, как LOCK TABLES был установлен на control и перед UNLOCK TABLES я нахожусь в каком-то режиме транзакций, где всем таблицам, которые будут использоваться, должен быть назначен уровень блокировки. WTF, я ничего не вижу в документах.

Почему я получаю эту проблему с table1 когда это не в рамках блокировки? Я не женат на этой стратегии, это просто то, что пришло в голову, если есть другой шаблон, который даст ту же функциональность, что и игра. Обходные? Предложения?

0 ответов

Другие вопросы по тегам