回答

收藏

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

技术问答 技术问答 258 人阅读 | 0 人回复 | 2023-09-12

这是一个有趣的情况。" S2 K9 s' c# t" K
我开始使用MySQL交易。我的交易涉及三个相关查询。每个查询都必须成功,否则,任何查询都不应写入数据库。
1 L9 `- \" b3 `4 O1 S现在…故意,对于第二询…恰好是一个UPDATE查询…我将更新记录的标志pk值变为无效(不存在)PK值。希望第二个查询出于测试目的失败。查询很好,但是c_id值错误(我试着不退出更新的记录)。! ?9 I% z) _% a" W6 ~# n
问题是查询是通过 OK”执行的。0 H6 V' U" N5 m+ t3 v
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这是一个问题,因为没有捕捉到错误(在我看来是错误的,因为必须更新的关键记录没有在相关的查询链中更新),所以事务没有停止和滚动,但继续成功地进行第三个查询,然后提交事务。% T+ m9 ^5 c" D4 e6 f* ?1 a
所以,我觉得奇怪的是,这个错误没有被误解MySQL捕获,或未被捕获MySQL标记错误。
6 S" b0 e* {& ^. u! O任何关于为什么或如何解决的见解?
* Y8 R$ W( d" x" u1 j. v$ {8 i  T                                                               
, k. i- M* ^5 @    解决方案:                                                                . `, N+ ]: m) @1 r  r' J1 c. {9 b
                                                                是的,0行已经更新了。如果这是你的逻辑上的错误,你应该测试受影响的行数,然后在行数为0时导致错误:. C2 i1 a! d3 T2 ^: ^% L6 ?
        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;错误会使事务回滚。要造成错误,只需调用一个例程,这个例程不存在,所以要解释这个问题:/ @0 m4 |. z0 [! d
如何在MySQL在函数中引起错误
% i0 ?. \, I* f- N( v) `9 _: _有关row_count()更多信息:
6 f/ v4 }# ~9 S# mhttp://dev.mysql.com/doc/refman/5.0/zh-CN/information-( q( p- W2 ]3 ~9 {4 Z' \
functions.html#function_row-$ {8 R7 V1 R+ Q  J0 q. N
count
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则