2012-03-29 7 views
1

Wie Rollback in mehreren gespeicherte Prozedur verwenden. Zur Zeit mache ich meinen Code in einer gespeicherten Prozedur, die für mich einfacher zu verwalten ist. Kann mir jemand ändern/vorschlagen, den gesamten Prozess rückgängig zu machen, wenn ein Fehler aufgetreten ist. Ich habe die SP-Probe für Sie zusammengefügt. DankMysql Rollback in sub-stored-Prozedur

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

Das Problem ist, konnte ich den Prozess in multiprocedure() gespeicherte Prozedur Rollback nicht. –

Antwort

-1

Entfernen Sie alle Rollbacks in Ihrem Code oben, dann wickeln Sie Ihre multi_procedure in einer anderen äußeren Prozedur, und führen Sie dann nur das Rollback in dem Außen Verfahren, basierend auf dem Wert in p_return_code.