MySQL记录UPDATE应该失败,但不会失败。为什么?

use*_*297 2 mysql sql

这是一个有趣的情况。

我开始使用MySQL进行交易。我的交易涉及3个相关查询。每个查询必须成功,否则,任何查询都不应写入数据库。

现在...故意,对于第二个查询...恰好是一个UPDATE查询...我将标识要更新记录的pk值更改为无效(不存在)的PK值。我希望第二个查询出于测试目的而失败。查询很好,只是c_id值是错误的(我尝试更新的记录不会退出)。

问题是查询是通过“ OK”执行的。

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   
Run Code Online (Sandbox Code Playgroud)

这是一个问题,因为未捕获到错误(在我看来是错误,因为必须更新的关键记录未在相关查询链中进行更新),因此事务没有中止和回滚,而是继续进行第三个查询也成功,然后提交事务。

因此,我感到奇怪的是,这种错误没有被MySQL捕获,或者没有被MySQL标记为错误。

关于为什么或如何解决的任何见解?

Dal*_*len 5

没错,已更新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;
Run Code Online (Sandbox Code Playgroud)

错误将使事务回滚。要引发错误,只需调用一个例程,该例程不存在,因此对此问题进行了解释: 如何在MySQL函数中引发错误

有关row_count()的更多信息:

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