Как избежать состояния гонки, если в MySQL выбрано несколько клиентов? - PullRequest
3 голосов
/ 20 марта 2012

У меня есть таблица task_id, которая имеет два столбца:

`tid`:task id,
`state`:0:unfinished,1:processing,2:finished

Легко, если я использую только один клиент (скрипт Perl): получить один unfinished идентификатор задачи, обновить его до processing,обработайте его и обновите до finished в цикле.

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

Ответы [ 2 ]

3 голосов
/ 20 марта 2012

Если механизм вашей таблицы mysql - INNODB, он блокирует эту конкретную строку при обновлении записи таблицы, поэтому другой запрос не будет конфликтовать с предыдущим обновлением.

2 голосов
/ 20 марта 2012

Обновление должно быть примерно таким:

update task_id set state=1 where tid=? and state=0;

, затем проверьте, действительно ли обновление изменило запись.

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