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