ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2019-07-26 14:14:53  阅读:217  来源: 互联网

标签:php mysql stored-procedures transactions rollback


我试图找出一种方法来检测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 ;

标签:php,mysql,stored-procedures,transactions,rollback
来源: https://codeday.me/bug/20190726/1545008.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有