![]() |
Модераторы: skyboy |
![]() ![]() ![]() |
|
GwinnBleidd |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 2.5.2008 Где: Украина, Донецк Репутация: нет Всего: нет |
СУБД MySQL.
Есть некоторая таблица innoDB c большим числом записей. Есть несколько скриптов, возможно на разных серверах, производящих операции над данными: выборки и обновления. Известно, что операция обработки одной записи требует много времени. Записи на обработку выбираются пакетами, скажем по 100 записей (впрочем количество не важно) Нужно распараллелить работу скриптов, так чтобы: 1. Были обработаны все записи в таблице 2. Все записи были обработаны только один раз 3. Минимизировать время ожидания каждого из скриптов 4. Обеспечить обнаружение ситуаций, когда скрипт аварийно завершается, не закончив обработку (думаю, средствами транзакции). Сервер БД предполагается стабильным. Иными словами, желательно такое поведение: каждый скрипт выбирает нужные ему записи и блокирует их. Другой скрипт выбирает свои записи, при этом должен не получать записи первого скрипта, и не блокироваться в ожидании записей, заблокированных первым скриптом. В случае сбоя заблокированные записи должны разблокироваться. Есть ли какие нибудь стандартные схемы решения подобных задач, подскажите плиз. Если есть у кого-то нестандартные решения или идеи, тоже поделитесь ![]() |
|||
|
||||
sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 8 Всего: 31 |
GwinnBleidd, смысл транзакций и блокировок в том, что бы изолировать процессы друг от друга, сделать так, что один процесс не догадывался, что с данными работает кто то другой.
По поводу, защиты от остановки скрипта - да, транзакция. По поводу, разделения работы - есть разные схемы синхронизации: 1) выделить один скрипт, который будет раздавать другим скриптам ID записей для обработки.. (мастер скрипт) 2) есть вам просто нужно обработать каждую запись 1 раз, то я думаю вам достаточно сделать разделяемую переменню между скриптами: "ID последней записи, направленной на обработку". Тогда каждый скрипт будет выбирать N записей начиная с этой самой переменнной, а потом увеличивать ее на N. Можно реализовать это через IPC, а можно и через БД. Через БД, например, так: заводим таблицу XXX из одного числа - "ID последней записи, направленной на обработку". Каждый скрипт делает: А) lock table XXX; B) select last_id from XXX; C) select bla from bla where id > last_id; D) update XXX set last_id = last_id + N; E) unlock table XXX; P.S. писал на псевдо языке. смотрите точный синтаксис команд P.P.S если основная таблица на InnoDB, рекомендую понизить уровень изоляции транзакции до Read Committed, иначе возможны дедлоки. |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | MySQL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |