php – 如何检测MySQL存储过程中的回滚?

我试图找出一种方法来检测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 or INOUT argument is not a
variable or NEW pseudo-variable in
BEFORE trigger

我不知道我错了什么,但我无法解决这个问题.

PHP脚本

$result=MysqLi_query($con,$procedure);
if(is_object($result))
{
//rollback happened do something!
}

如果SP成功,则抛出真实.

解决方法:

您可以添加输出参数,然后将其设置为退出处理程序中所需的值.

以下是使用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 ;

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...