3

可能重复:
MySQL 中是否允许嵌套事务?

我有一个使用事务的存储过程,并且在事务内部调用另一个也使用事务并更新表的过程。第二个过程在循环内调用,每次调用都会更新一行。第二个过程还创建一个临时表。引擎是用于永久表的 InnoDB 和用于临时表的 MyISAM。MySQL 版本是 5.5.16。

如果发生错误,我想要回滚第二个过程所做的所有更新。

这可能吗 ?我知道一个 DDL 语句并开始事务;将发出提交,但有办法解决吗?

代码看起来像这样:(回滚显然不起作用)

delimiter $$
drop procedure if exists `proc1`$$
create procedure `proc1`( 
  ...#some variables
) 
modifies sql data

begin
    declare error int default 0;
    declare continue handler for sqlexception
    begin 
        set error=1;
    end;


     drop temporary table if exists table1;
     create temporary table table1 (

         id int unsigned, 
         col1 decimal(12,6) default 0, 
         col2 decimal (12,6) default 0, 
         col3 decimal (12,6),

         primary key (id)) engine=MyISAM;

     START TRANSACTION;
        begin
           declare id_1 int unsigned;
           declare v1 decimal(12,6) default 0;
           declare v2 decimal(12,6) default 0;
           declare v3 decimal(12,6) default 0;

           declare done int default 0;

          declare cur cursor for select id, col1, col2 from table1;
          declare continue handler for not found set done=1;

          begin
              open cur; 
              wh: while done=0 do
                  fetch cur into id, v1, v2;
                   if done=1 then
                          leave wh;
                   end if;

                   set v3=v1+v2 ;                                      
                   update table1 set col3=v3 where id =id_1;

                   CALL  proc2(id_1, v1, v2, v3);

                   end while wh;
                   close cur;
                   set done=0;
                 end;

            end;
           if error=0 then
                  commit;
                  set status=1;

            else 
                  rollback;
                 set status=-1;
            end if;


end$$
4

1 回答 1

6

您一次只能打开一项交易。在已经存在事务时尝试启动新事务会导致现有事务被提交。但是,您可以使用savepoints模拟嵌套事务。

于 2012-09-22T11:03:17.660 回答