Обновление MySQL возвращает 0 строк, затронутых в транзакции

Учетная запись таблицы имеет специальное поле 'executor', чтобы демоны знали, что учетная запись заблокирована для обновления одним из демонов.

Шаг за шагом:

  1. начать транзакцию
  2. заблокировать аккаунт с помощью:

    UPDATE `account` SET `executor` = 2727 WHERE `executor` is NULL AND `id` = 1234;
    
  3. некоторые операции. На этом этапе другие демоны могут выбрать строку с id=1234 и попытаться обновить ее (или обновить другие поля, а не "executor")

  4. статус аккаунта возвращается с:

    UPDATE `account` SET `executor` = NULL WHERE `executor` = 2727 AND `id` = 1234;
    
  5. совершить

Иногда на шаге 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

далее откат транзакции... если снова повторить операцию, все нормально без сброса значения исполнителя...

0 ответов

Другие вопросы по тегам