Как обновить MySQL (MyISAM) таблицу параллельно? - PullRequest
1 голос
/ 22 января 2011

У меня есть параллельный скрипт bash с несколькими потоками. Каждый поток проверяет, существует ли запись, затем обновляет значение, иначе вставляет новую строку. Должен ли я заботиться о параллелизме потоков? Стоит ли блокировать таблицы разблокировки или MySQL заботится об этом?

мое обновление идет через командную строку:

#get.sh script...
# set status Downloading
mysql -uroot -pmypass -ss -e "use filestatus; call changeStatus(\"$1/$2\", 1)" 
rsync  -ar  rsync://user@server/$2/ $1/$2/
if [ $? -eq 0 ]; 
then 
# set status OK
mysql -uroot -pmypass -ss -e "use filestatus; call changeStatus(\"$1/$2\", 0)" 
else
# set status ERROR
mysql -uroot -pmypass -ss -e "use filestatus; call changeStatus(\"$1/$2\", 2)" 
fi

Я вызываю несколько get.sh с разными параметрами.


Заранее спасибо
Арман.

1 Ответ

2 голосов
/ 22 января 2011

Вы могли бы реализовать блокировку, но это потеряет цель иметь несколько потоков. MyISAM поддерживает только блокировку на уровне таблицы, поэтому только 1 поток сможет изменять таблицу одновременно.

Если можете, поместите уникальный индекс или первичный ключ в поле (я). Выполните команду INSERT ... ON DUPLICATE KEY UPDATE ... MySql убедится, что действие является атомарным.

Что я обычно делаю с многопоточностью / обработкой, так это чтобы первый поток / процесс получил «список» всех заданий, которые необходимо выполнить, а затем создал поток / ответвление для обработки каждого задания или пакета заданий , Родительский поток / процесс гарантирует, что дети не пытаются сделать то же самое. Я не уверен, сработает ли это в вашем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...