【问题标题】:transaction in mysql stored proceduremysql存储过程中的事务
【发布时间】:2013-10-28 12:36:56
【问题描述】:

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

你能帮我解决我的问题吗?

提前谢谢你。

【问题讨论】:

    标签: mysql stored-procedures transactions


    【解决方案1】:

    这里有一些有趣的事情:一旦你运行START TRANSACTION,任何打开的事务都会隐式提交。我在 DBA StackExchange 中写过这个:March 15, 2013 : MySQL backup InnoDB

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

    试试看!!!

    更新 2013-10-28 09:16 EDT

    如果你可以在一个事务中调用一个事务,你就不能再次调用START TRANSACTION。如果您想从test2 回滚并从调用test2 开始将test1 保留在事务中,您应该考虑使用SAVEPOINT and ROLLBACK TO SAVEPOINT in the MySQL Docuementation

    基本上,您会在调用test2 之前在test1 中创建SAVEPOINT。如果test2 无论如何都失败,您将回滚到 SAVEPOINT

    【讨论】:

    • 实际上我在这里提到了示例代码,但在我们的项目中,事务 blk 在另一个存储过程中是必需的。
    猜你喜欢
    • 2012-04-15
    • 2021-06-02
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    相关资源
    最近更新 更多