MySQL嵌套事务 - 不回滚

时间:2012-09-22 10:38:04

标签: mysql transactions rollback

  

可能重复:
  Are nested transactions allowed in 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$$

0 个答案:

没有答案