gpt4 book ai didi

mysql - mysql 存储过程中的事务

转载 作者:行者123 更新时间:2023-11-30 01:07:36 25 4
gpt4 key购买 nike

我想用事务编写存储过程。假设,proc1 正在调用事务 block 中的另一个 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 ;

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

提前谢谢您。

最佳答案

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

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

尝试一下!!!

更新 2013-10-28 09:16 美国东部时间

如果您可以在事务中调用事务,则无法再次执行START TRANSACTION。如果您想从 test2 回滚并在调用 test2 时将 test1 保留在事务中,则应该考虑使用 SAVEPOINT and ROLLBACK TO SAVEPOINT in the MySQL Docuementation .

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

关于mysql - mysql 存储过程中的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19634995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com