Я пытаюсь найти способ обнаружить откат в хранимой процедуре MySQL, чтобы я мог соответствующим образом обработать ситуацию из сценария PHP, но пока не могу найти никакого решения.
Моя хранимая процедура выглядит следующим образом:
delimiter |
create procedure multi_inserts(
IN var1 int(11),
.
.
.
IN string1 text
)
BEGIN
declare exit handler for sqlexception rollback;
declare exit handler for sqlwarning rollback;
START TRANSACTION;
insert into table1(a,b,c,d) values(var1,var2,var3,var4);
insert into table2(e,f,g) values(var5,var6,string1);
COMMIT;
END
delimiter ;
Я провел тест отката для этой процедуры, и он сделал откат, но я не получил ложных.Я хочу, чтобы моя хранимая процедура выдавала какое-то сообщение об ошибке, если транзакция не удалась, поэтому я могу обработать ее следующим образом:
$result = mysql_query($procedure);
if(!$result)
{
//rollback occured do something
}
Есть ли способ обнаружить откат в MySQL?Я что-то пропустил?Любой ответ будет оценен.Спасибо за чтение.
Благодаря вашим советам я исправил эту проблему.Вот что я сделал:
Хранимая процедура
delimiter |
create procedure multi_inserts(
IN var1 int(11),
.
.
.
IN string1 text
)
BEGIN
declare exit handler for sqlexception sqlwarning
BEGIN
rollback;
select -1;
END;
START TRANSACTION;
insert into table1(a,b,c,d) values(var1,var2,var3,var4);
insert into table2(e,f,g) values(var5,var6,string1);
COMMIT;
END
delimiter ;
Если я использую переменную вместо select -1, она выдаст мне эту ошибку:
Аргумент OUT или INOUT не является переменной или новой псевдопеременной в ПЕРЕД триггером
Я не знаю, что я сделал не так, но я не смог решить эту проблему.* PHP скрипт
$result=mysqli_query($con,$procedure);
if(is_object($result))
{
//rollback happened do something!
}
Если SP успешен, он выдает true.