【问题标题】:MySQL record UPDATE should fail but does not. Why?MySQL 记录更新应该失败但不会。为什么?
【发布时间】:2011-07-28 10:22:59
【问题描述】:

这是一个有趣的情况。

我用 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   

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

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

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

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    是的,更新了 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

    【讨论】:

      猜你喜欢
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多