我想用事务编写存储过程。假设,proc1在事务块中调用另一个proc(proc2)。 proc2还包含回滚/提交。如果在proc1中发生回滚,在proc2中是否也会发生回滚? 我试过以下示例,但它没有用。 以下是代码
test1.sql
DELIMITER $$
DROP PROCEDURE IF EXISTS `debug`.`test1`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `test1`()
begin
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @errorOccurred :=2;
set @errorOccurred :=1;
START TRANSACTION;
insert into Table1 values("table1_1");
insert into debug values("insertStatement_1");
insert into Table1 values(1,2);
call test2();
if (@errorOccurred=2) then
ROLLBACK;
else
COMMIT;
end if;
end$$
DELIMITER ;
=========================================
test2.sql
DELIMITER $$
DROP PROCEDURE IF EXISTS `debug`.`test2`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `test2`()
begin
START TRANSACTION;
create table Table2 (msg varchar(255)) ENGINE=InnoDB;
insert into Table2 values("table2_value");
COMMIT;
end$$
DELIMITER ;
你能帮我解决一下我的问题。
提前谢谢。
答案 0 :(得分:0)
以下是一些有趣的内容:运行START TRANSACTION后,任何打开的事务都将隐式提交。我在DBA StackExchange中写过这篇文章:March 15, 2013 : MySQL backup InnoDB。
建议:我会从test2.sql中删除START TRANSACTION;
和COMMIT;
。
试一试!!!
如果您可以在交易中调用交易,则无法再次START TRANSACTION
。如果您要从test2
回滚并在调用test1
时保留test2
,请考虑使用SAVEPOINT and ROLLBACK TO SAVEPOINT in the MySQL Docuementation。
基本上,您可以在调用test1
之前在test2
中创建 SAVEPOINT 。如果test2
失败,您将回滚到 SAVEPOINT 。