Ich versuche, die Savepoints in MySQL zu verwenden, und es scheint, dass etwas schief geht.
Ich erhalte eine Fehlermeldung wie unten gezeigt:
FEHLER 1305 (42000): SAVEPOINT sp_prc_work existiert nicht
Meine Verfahren mit oder ohne Speicherpunkte funktionieren genau gleich. Was ich erwartet hatte, war, dass der Wert '4', 'pqr' nicht in der Tabelle erscheinen sollte, da die gesamte Transaktion zurückgerollt wird. Aber sowohl 3 als auch 4 ID's werden eingefügt. Ich verstehe, warum der Eintrag '3', 'pqr' da ist, aber ich denke, die ID '4' sollte nicht da sein.
drop table if exists test.savepoint_test;
drop procedure if exists second_fail;
drop procedure if exists prc_work;
CREATE TABLE test.savepoint_test (
id int not null default '0',
name varchar(100),
primary key (id)
)engine=InnoDB;
insert into test.savepoint_test values ('1', 'abc');
insert into test.savepoint_test values ('2', 'xyz');
select * from test.savepoint_test;
delimiter $$
CREATE PROCEDURE second_fail()
BEGIN
INSERT into test.savepoint_test values ('3', 'pqr');
INSERT into test.savepoint_test values ('2', 'mnp');
END;
$$
CREATE PROCEDURE prc_work()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK TO sp_prc_work;
SAVEPOINT sp_prc_work;
INSERT into test.savepoint_test values ('4', 'pqr');
INSERT into test.savepoint_test values ('2', 'mnp');
END;
$$
delimiter ;
call second_fail();
select * from test.savepoint_test;
call prc_work();
select * from test.savepoint_test;