MySQL UPDATE должна завершиться ошибкой, но это не так.Зачем? - PullRequest
1 голос
/ 03 апреля 2011

вот интересная ситуация.

Я начинаю транзакцию с MySQL. Моя транзакция включает 3 связанных запроса. Каждый запрос должен быть успешным, и если нет, то ни один из них не должен быть записан в базу данных.

Теперь ... специально для второго запроса ... который является запросом ОБНОВЛЕНИЯ ... Я изменил значение pk, идентифицирующее запись, которая будет обновлена ​​до недопустимого (несуществующего) значения PK. Я хотел, чтобы 2-й запрос не прошел тестирование. Запрос в порядке, просто значение c_id неверно (запись, которую я пытаюсь ОБНОВИТЬ, не завершается).

Проблема в том, что запрос выполняется с "ОК" ...

mysql> UPDATE tableX SET bal = 4576.99 WHERE c_id = 3789;  
Query OK, 0 rows affected (0.00 sec)  
Rows matched: 0  Changed: 0  Warnings: 0   

Это проблема, потому что ошибка (с моей точки зрения, ошибка, поскольку ключевая запись, которая должна быть обновлена, не была обновлена ​​в цепочке связанных запросов) не была обнаружена, и транзакция, таким образом, не прервалась и не выполнялась откат, вместо этого процесс переходит к третьему запросу, который также успешно выполняется, и затем транзакция фиксируется.

Итак, я нахожу странным, что такая ошибка не обнаруживается MySQL или не помечается как ошибка MySQL.

Есть какие-нибудь идеи относительно того, почему или как это исправить?

1 Ответ

4 голосов
/ 03 апреля 2011

Это правильно, 0 строк были обновлены. Если, по вашей логике, это ошибка, вы должны проверить количество затронутых строк, а затем вызвать ошибку, если это число равно 0:

  DECLARE count INT;
  UPDATE tableX SET bal = 4576.99 WHERE c_id = 3789;
  SELECT ROW_COUNT() INTO count;
  IF count = 0 THEN
     CALL raise_error;
  END IF;

ошибка сделает откат транзакции. Чтобы вызвать ошибку, просто вызовите подпрограмму, которая не существует, как объяснено в этом вопросе SO: Как вызвать ошибку в функции MySQL

дополнительная информация о row_count ():

http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_row-count

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