2012-09-22 58 views
3

可能重複:
Are nested transactions allowed in MySQL?MySQL的嵌套事務 - 不回滾

我已存儲使用事務和事務內部調用也使用交易和更新了另一個程序程序S表。第二個過程在循環內調用,每次調用都會更新一行。這第二個過程也會創建一個臨時表。 引擎是用於永久表的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$$ 

回答

5

您只能同時打開一個交易。嘗試在已有事務已經存在時導致現有事務被提交時啓動新事務。但是,您可以使用savepoints來模擬嵌套事務。