gpt4 book ai didi

MySQL 嵌套事务 - 不回滚

转载 作者:可可西里 更新时间:2023-11-01 07:59:32 25 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
Are nested transactions allowed in MySQL?

我有一个使用事务的存储过程,在事务内部调用另一个也使用事务并更新表的过程。第二个过程在循环内调用,每次调用都会更新一行。第二个过程还创建了一个临时表。引擎是永久表的 InnoDB 和临时表的 MyISAM。MySQL版本为5.5.16。

我想要的是如果发生错误,回滚第二个过程所做的所有更新。

这可能吗?我知道一条 DDL 语句并开始事务;将发出提交,但有解决办法吗?

代码看起来像这样:(回滚显然不行)

delimiter $$
drop procedure if exists `proc1`$$
create procedure `proc1`(
...#some variables
)
modifies sql data

begin
declare error int default 0;
declare continue handler for sqlexception
begin
set error=1;
end;


drop temporary table if exists table1;
create temporary table table1 (

id int unsigned,
col1 decimal(12,6) default 0,
col2 decimal (12,6) default 0,
col3 decimal (12,6),

primary key (id)) engine=MyISAM;

START TRANSACTION;
begin
declare id_1 int unsigned;
declare v1 decimal(12,6) default 0;
declare v2 decimal(12,6) default 0;
declare v3 decimal(12,6) default 0;

declare done int default 0;

declare cur cursor for select id, col1, col2 from table1;
declare continue handler for not found set done=1;

begin
open cur;
wh: while done=0 do
fetch cur into id, v1, v2;
if done=1 then
leave wh;
end if;

set v3=v1+v2 ;
update table1 set col3=v3 where id =id_1;

CALL proc2(id_1, v1, v2, v3);

end while wh;
close cur;
set done=0;
end;

end;
if error=0 then
commit;
set status=1;

else
rollback;
set status=-1;
end if;


end$$

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