错误时回滚事务

时间:2013-12-30 07:50:35

标签: mysql

我正在使用此查询在两个不同的列中添加行

    START TRANSACTION;
   SET @c=0;

   INSERT INTO tbl_chart (acode,adesc)  VALUES (2,'3');
   INSERT INTO tbl_pics  (ID ,adesc) VALUES (1,'1');
   select ROW_COUNT() into @c ;

   IF ( c > 0) THEN
       COMMIT ;
   ELSE 
       ROLLBACK;
   END IF

并尝试检查row_count并将其值保存在变量c中。 但是这个查询会产生错误,并且在显示错误后也会保存数据。 问题出在哪里?

错误是这样的:

    /* SQL Error (1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF ( c > 0) THEN
COMMIT' at line 1 */

2 个答案:

答案 0 :(得分:3)

取自另一篇文章MYSQL If statement in transaction causing error

  

MySQL无法识别以关键字IF开头的语句   作为有效的SQL语句。

     

IF语句仅适用于复合语句的上下文   (即BEGIN和END之间的一个语句块。   目前,复合语句仅在上下文中受支持   存储的程序(存储过程,函数或触发器。)

答案 1 :(得分:1)

正如Rahul所说,IF语句仅适用于存储过程,函数或触发器。

我想补充一点,你根本不需要计算是否插入了多少行。以下是如何在存储过程中解决此问题的示例。但是,如果您更愿意在应用程序代码中实现它背后的逻辑,那么这是您的选择。

drop procedure if exists sp_my_transaction;
delimiter $$
create procedure sp_my_transaction()
begin

declare continue handler for sqlexception
begin
   rollback;
   exit procedure;
end;


start transaction;
   INSERT INTO tbl_chart (acode,adesc)  VALUES (2,'3');
   INSERT INTO tbl_pics  (ID ,adesc) VALUES (1,'1');
commit;

end $$
delimiter ;

然后,您将使用

执行该过程
call sp_my_transaction();

它背后的逻辑是,用

定义
declare continue handler for sqlexception

发生错误时该怎么办。如果发生这种情况并且您没有继续处理程序,则该过程将简单地中止,并且该事务仍将处于打开状态。在这种情况下,在发生错误的点之后的代码永远不会到达,因此您的事务也不会被提交。