Обновление MySQL возвращает 0 строк, затронутых в транзакции
Учетная запись таблицы имеет специальное поле 'executor', чтобы демоны знали, что учетная запись заблокирована для обновления одним из демонов.
Шаг за шагом:
- начать транзакцию
заблокировать аккаунт с помощью:
UPDATE `account` SET `executor` = 2727 WHERE `executor` is NULL AND `id` = 1234;
некоторые операции. На этом этапе другие демоны могут выбрать строку с id=1234 и попытаться обновить ее (или обновить другие поля, а не "executor")
статус аккаунта возвращается с:
UPDATE `account` SET `executor` = NULL WHERE `executor` = 2727 AND `id` = 1234;
- совершить
Иногда на шаге 4 mysql возвращает статус успешного выполнения, но это затрагивает 0 строк. Это происходит 1 раз при 10000 транзакциях.
Что я делаю неправильно? Или это ошибка MySQL?
ОБНОВИТЬ:
после наблюдений получаю следующее:
1) сначала мы делаем
UPDATE `account` SET `executor` = 2727 WHERE `executor` is NULL AND `id` = 1234;
2) запись блоков транзакций
3) во время транзакции делаю
`UPDATE `account` SET `balance` = 1 WHERE `id` = 1234;`
4) после этого запроса
SELECT `executor` FROM `account` WHERE `id`=1234
дает результат 2727
после нескольких повторов пунктов 3 и 4 мы получаем результат executor
=NULL... или 0, так как я записываю результат в переменную с типом int, но это, вероятно, все тот же NULL... но это не так важно.. в любом случае исполнитель перестал быть значением 2727
далее откат транзакции... если снова повторить операцию, все нормально без сброса значения исполнителя...