2012-03-29 3 views
1

複数のストアドプロシージャでロールバックを使用する方法。現在、私は自分のコードをSAのストアドプロシージャで実行するので、簡単に維持することができます。エラーが発生した場合は誰でもプロセス全体をロールバックするように修正/提案することができます。 私はプレイするためにSPサンプルを添付しました。 おかげサブストアドプロシージャのMysqlロールバック

CREATE TABLE `customer` (
    `dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `cus_no` int(11) DEFAULT NULL, 
    PRIMARY KEY (`dt`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

drop procedure if exists multi_procedure; 
create procedure multi_procedure() 
    BEGIN 
     DECLARE p_return_code tinyint DEFAULT 0; 
     DECLARE exit handler for sqlexception 
     BEGIN 
     -- ERROR 
     set p_return_code = 1; 
     #SELECT "sqlexception"; 
     rollback; 
     END; 

     DECLARE exit handler for sqlwarning 
     BEGIN 
     -- WARNING 
     set p_return_code = 2; 
     #SELECT "sqlwarning"; 
     rollback; 
     END; 

     START TRANSACTION; 
       INSERT into customer (cus_no) values(111); 
       CALL Sub_Procedure1(p_return_code); 
       IF p_return_code = 1 OR p_return_code = 2 THEN 
       rollback; 
       END IF; 
       CALL Sub_Procedure1(p_return_code); 
       IF p_return_code = 1 OR p_return_code = 2 THEN 
       rollback; 
       END IF;    


     COMMIT; 

     -- SUCCESS 
     #set p_return_code = 0; 
END; 

drop procedure if exists Sub_Procedure1; 
create procedure Sub_Procedure1(OUT p_return_code tinyint unsigned) 
    BEGIN  
     DECLARE exit handler for sqlexception 
     BEGIN 
     -- ERROR 
     set p_return_code = 1; 
     #SELECT "sqlexception"; 
     rollback; 
     END; 

     DECLARE exit handler for sqlwarning 
     BEGIN 
     -- WARNING 
     set p_return_code = 2; 
     #SELECT "sqlwarning"; 
     rollback; 
     END; 

     START TRANSACTION; 
      INSERT into customer (cus_no) values(222); 

     COMMIT; 

     set p_return_code = 0; 
    END; 

drop procedure if exists Sub_Procedure2; 
create procedure Sub_Procedure2(OUT p_return_code tinyint unsigned) 
    BEGIN  
     DECLARE exit handler for sqlexception 
     BEGIN 
     -- ERROR 
     set p_return_code = 1; 
     #SELECT "sqlexception"; 
     rollback; 
     END; 

     DECLARE exit handler for sqlwarning 
     BEGIN 
     -- WARNING 
     set p_return_code = 2; 
     #SELECT "sqlwarning"; 
     rollback; 
     END; 

     START TRANSACTION; 
      INSERT into customer (cus_no) values('aaaabbb'); #There will be sqlexception because the 'cus_no' should be in integer 
     COMMIT; 

     set p_return_code = 0; 
    END; 
+0

問題は、multi_procedure()ストアドプロシージャのプロセスをロールバックできませんでした。 –

答えて

-1

は別の外の手順でごmulti_procedureをラップ、その後、上記のコード内のすべてのロールバックを削除し、のみp_return_codeの値に基づいて、外側の手順でロールバックを行います。

関連する問題