mysql存储过程中的事务

时间:2013-10-28 12:36:56

标签: mysql stored-procedures transactions

我想用事务编写存储过程。假设,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 ;

你能帮我解决一下我的问题。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

以下是一些有趣的内容:运行START TRANSACTION后,任何打开的事务都将隐式提交。我在DBA StackExchange中写过这篇文章:March 15, 2013 : MySQL backup InnoDB

建议:我会从test2.sql中删除START TRANSACTION;COMMIT;

试一试!!!

更新2013-10-28 09:16 EDT

如果您可以在交易中调用交易,则无法再次START TRANSACTION。如果您要从test2回滚并在调用test1时保留test2,请考虑使用SAVEPOINT and ROLLBACK TO SAVEPOINT in the MySQL Docuementation

基本上,您可以在调用test1之前在test2中创建 SAVEPOINT 。如果test2失败,您将回滚到 SAVEPOINT