Django, innodb и блокировка на уровне строк - PullRequest
0 голосов
/ 16 ноября 2011

У меня есть таблица с данными для анализа и рабочий, который берет несколько записей из нее, обрабатывает их и сохраняет их обратно.Он также устанавливает флаг в 'parsed'.

Теперь я хочу запустить несколько экземпляров работника и убедиться, что два работника не выберут одну и ту же строку для обработки одновременно.Поэтому мне нужно как-то его заблокировать.

Я использую django, и из того, что я прочитал в руководстве по MySQL, можно получить блокировку на уровне строк, но я не могу найти ни одного примера, как сделать это правильно.Только один говорит, что он очень медленный :) http://djangosnippets.org/snippets/2039/

У меня могло бы быть другое поле, говорящее 'блокировка до', которое будет меткой времени, обновленной до настоящего момента + X минут после того, как работник выбрал строку.Это сократит время блокировки (непосредственное обновление после выбора) и предотвратит выбор этой строки другим работником, который проверит, не заблокирован ли он, но проблема блокировки между выбором и обновлением все еще существует.

Спасибо!Иэн

Ответы [ 2 ]

1 голос
/ 16 ноября 2011

2 преобладающих способа хранения данных в Mysql - это MyISAM & InnoDB. У каждого свои плюсы и минусы -

  1. InnoDB восстанавливается после сбоя или другого неожиданного завершения работы путем воспроизведения его журналов.
  2. InnoDB может работать в режиме, в котором он имеет более низкую надежность, но в некоторых случаях более высокую производительность.
  3. InnoDB автоматически группирует несколько одновременных вставок и сбрасывает их на диск одновременно.
  4. InnoDB сбрасывает журнал транзакций после каждой транзакции, значительно повышая надежность.
  5. В отличие от InnoDB, MyISAM имеет встроенный полнотекстовый поиск
  6. MyISAM по-прежнему широко используется в веб-приложениях, поскольку традиционно считалось, что он быстрее, чем InnoDB, в ситуациях, когда большая часть доступа к БД считывается.
  7. При записи / обновлении данных в таблицу InnoDB блокируется только эта конкретная строка, тогда как в MyISAM блокируется вся таблица.
  8. InnoDB обеспечивает полную поддержку транзакций.

Что касается моделей django, то они по умолчанию поддерживают создание таблицы myisam. Если вам нужны таблицы для блокировки на уровне строк, вам нужен innodb. Эта страница должна быть хорошей отправной точкой:

Он описывает способ подключения к крюку post_syncdb для динамического запуска команд ALTER SQL для изменения механизма таблиц. (Обратите внимание, что это было написано 4 года назад, и, возможно, потребуется обновить его до текущей версии Django).

Вам должно быть просто добавить метаданные в ваши модели, которые определяют, какой механизм хранения использовать для каждой таблицы. Затем вы можете изменить приведенный выше пример, чтобы отключить эти метаданные.

0 голосов
/ 16 ноября 2011

с блокировкой, второй рабочий просто застрянет в ожидании снятия блокировки.

возможно, вы могли бы пометить записи как «работа над этой записью в [timestamp]» перед началом обработки, и последующие работники игнорируют такие строки.затем вы можете получить задание cron или аналогичные «освобождающие» строки, у которых отметка времени старше некоторого порога, но еще не помечена как «выполнено» (что указывает на то, что работник умер или что-то еще пошло не так)

...