我正在试图找出一种方法来检测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 ;
如果我使用变量而不是选择-1,它会给我这个错误:
OUT或INOUT参数不是 变量或新的伪变量 触发之前
我不知道我错了什么,但我无法解决这个问题。
PHP脚本
$result=mysqli_query($con,$procedure);
if(is_object($result))
{
//rollback happened do something!
}
如果SP成功,则抛出真实。
答案 0 :(得分:7)
您可以添加输出参数,然后将其设置为退出处理程序中所需的值。
以下是使用proc的示例:
delimiter $$
create procedure multi_inserts(
IN var1 int(11),
.
.
.
IN string1 text,
OUT p_return_code tinyint unsigned
)
BEGIN
DECLARE exit handler for sqlexception
BEGIN
-- ERROR
set p_return_code = 1;
rollback;
END;
DECLARE exit handler for sqlwarning
BEGIN
-- WARNING
set p_return_code = 2;
rollback;
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;
-- SUCCESS
set p_return_code = 0;
END $$
delimiter ;
答案 1 :(得分:1)
如果你想捕捉错误,你通常会做这个PHP端。请阅读http://php.net/manual/en/pdo.transactions.php以获取更多信息。
答案 2 :(得分:0)
嘿做一件事,使用OUTPUT变量并返回1或0作为SP的结果,并在此标志上执行任何操作。
答案 3 :(得分:0)
<?php
try {
$user='root';
$pass='';
$dbh = new PDO('mysql:host=localhost;dbname=dbname', $user, $pass,
array(PDO::ATTR_PERSISTENT => true));
echo "Connected\n";
} catch (Exception $e) {
die("Unable to connect: " . $e->getMessage());
}
try {
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->beginTransaction();
$dbh->exec("insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')");
$dbh->exec("insert into salarychange (id, amount, changedate)
values (23, 50000, NOW())");
$dbh->commit();
}
catch (Exception $e) {
$dbh->rollBack();
echo "Failed: " . $e->getMessage();
}
?>