这是一个有趣的情况。
我用 MySQL 开始一个事务。我的交易涉及3个相关查询。
每个查询都必须成功,如果没有成功,则不应将任何查询写入数据库。
现在...故意,对于第二个查询...这恰好是一个更新查询...我改变了
标识要更新为无效(不存在)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标记为错误。
关于原因或如何解决的任何见解?
正确,更新了 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;
错误将使事务回滚。
要引发错误,只需调用一个不存在的例程,如这个问题所解释的:如何在 MySQL 函数中引发错误 https://stackoverflow.com/questions/465727/raise-error-within-mysql-function
有关 row_count() 的更多信息:
http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_row-count http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_row-count
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)