Php 处理';交易';以编程方式
我有一个进程,它创建两个数据库表条目,并向authorize.net api发送两个请求 现在,如果在这个过程中的任何时候,程序由于任何原因出错,我想“回滚”。在我们的系统中创建的任何条目都应该被删除,并且应该通知用户有错误,并且应该给用户重试的选项 流的淡化版本如下所示:Php 处理';交易';以编程方式,php,mysql,authorize.net,Php,Mysql,Authorize.net,我有一个进程,它创建两个数据库表条目,并向authorize.net api发送两个请求 现在,如果在这个过程中的任何时候,程序由于任何原因出错,我想“回滚”。在我们的系统中创建的任何条目都应该被删除,并且应该通知用户有错误,并且应该给用户重试的选项 流的淡化版本如下所示: 创建账户分录->创建用户分录->向Authorize.net发送一次性付款请求->从Authorize.net保存一次性付款请求结果->向Authorize.net发送定期付款请求->从Authorize.net保存定期付款
创建账户分录->创建用户分录->向Authorize.net发送一次性付款请求->从Authorize.net保存一次性付款请求结果->向Authorize.net发送定期付款请求->从Authorize.net保存定期付款请求结果
处理这种情况的最佳方法是什么?您只需使用表格,然后就可以使用。(即:您将使用
开始
,尝试执行必要的处理,然后相应地发出提交
或回滚
。您只需要使用一个表,然后就可以使用。(即:您将使用开始
,尝试执行必要的处理,然后相应地发出提交
或回滚
。我将使用常规InnoDB事务来处理数据库部分。不过,回滚Authorize.NET调用会更加棘手,只需要非常小心地处理异常。我会使用常规InnoDB事务来处理数据库部分。不过,回滚Authorize.NET调用会更加棘手,只需要非常小心地处理异常。您可以在事务中包装查询。请注意,要回滚的表需要将其引擎设置为innodb。下面是代码外观的示例:
//Wrap your queries in a transaction
mysql_query("START TRANSACTION");
try{
//your stuff - if your stuff is successful commit, in the event of an error rollback
if($success){
mysql_query("COMMIT");
}
else{
mysql_query("ROLLBACK");
}
}catch(Exception $e){
//if something goes seriously wrong
mysql_query("ROLLBACK");
}
您可以在事务中包装查询。请注意,要回滚的表需要将其引擎设置为innodb。下面是代码外观的示例:
//Wrap your queries in a transaction
mysql_query("START TRANSACTION");
try{
//your stuff - if your stuff is successful commit, in the event of an error rollback
if($success){
mysql_query("COMMIT");
}
else{
mysql_query("ROLLBACK");
}
}catch(Exception $e){
//if something goes seriously wrong
mysql_query("ROLLBACK");
}