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

时间:2011-04-02 22:27:13

标签: 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   

这是一个问题,因为错误(我的观点是错误,因为必须更新的密钥记录未在相关查询链中更新)没有被捕获,因此事务没有中止和回滚,而是进程继续进行第3次查询,该查询也成功,然后提交事务。

所以,我觉得奇怪的是,这样的错误没有被MySQL捕获或没有被MySQL标记为错误。

有关为何或如何修复的任何见解?

1 个答案:

答案 0 :(得分:4)

这是正确的,更新了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问题所述: How to raise an error within a MySQL function

有关row_count()的更多信息:

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