2012-03-29 5 views
1

Как использовать откат в нескольких хранимых процедурах. В настоящее время я делаю свой код в хранимой процедуре saperate, так что мне легче поддерживать. Может ли кто-нибудь изменить/предложить мне откат всего процесса, если произошла какая-то ошибка. Я приложил вместе образец SP для u, чтобы играть. БлагодаряОткат 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.

Смежные вопросы