Откат Mysql в подпрограмме - PullRequest
1 голос
/ 29 марта 2012

Как использовать откат в нескольких хранимых процедурах.В настоящее время я делаю свой код в виде хранимой процедуры, чтобы мне было легче поддерживать.Может кто-нибудь изменить / предложить мне откатить весь процесс, если произошла какая-то ошибка.Я приложил образец SP для вас, чтобы играть.Спасибо

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;  

1 Ответ

0 голосов
/ 11 июня 2013

удалите все откаты в приведенном выше коде, затем оберните вашу multi_procedure в другую внешнюю процедуру, а затем выполните только откат во внешней процедуре на основе значения в p_return_code.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...