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;
問題は、multi_procedure()ストアドプロシージャのプロセスをロールバックできませんでした。 –