【问题标题】:PHP: Undo if Exception occursPHP:如果发生异常则撤消
【发布时间】:2019-03-03 13:28:33
【问题描述】:

如果发生异常,PHP/Laravel 中有没有办法撤消多个步骤?我知道DB::transaction(function()...,但是在使用外部库的情况下它不起作用......

就我而言,我使用的是 Stripe:

1.) 创建Source

2.) 创建Customer

3.) 将Source 附加到Customer

4.) 为Customer 创建一个Subscription

但如果有来自 Stripe 的 external Exception,例如在最后一步,我希望其他三个步骤不执行,而是返回错误消息。

注意:我正在使用 Laravel 的异常处理程序来 catch 异常。

如果有办法解决这个问题,我会很高兴:-)


这与可能的重复不同,因为如果发生异常,我想撤消几个步骤

【问题讨论】:

  • @Martin 这不会撤消在 try 子句中已经成功的操作。
  • 感谢您的 cmets。 @Martin 我认为撤消前面的步骤无济于事......如果发生异常,它会转到 catch 块,但前面的步骤会执行
  • 你总是可以有一个回滚历史,例如“创建源代码和函数$rollback = function () use ($source) { delete source }”然后在每个步骤中编写这个函数以及在发生错误时要做什么,如果你发现错误调用回滚函数。或者您可以询问 Stripe API 开发人员,他们是否可以对他们的 API 进行这种跨国/原子访问,或者要求一个新的 API 调用以原子方式执行这 4 个步骤。此 AFAIK 没有通用解决方案
  • @SebastianS 我想你提到 Laravel 和 DB::Transaction() 让每个人都感到困惑。这仅对回滚对您自己的数据库的更改有用,与远程 API 无关。

标签: php laravel exception undo


【解决方案1】:

您可以像这样手动使用数据库事务:

DB::beginTransaction();

// create your source, customer and attach them

// perform your api call and catch on exection

在你的 api 调用的 catch 块中运行这个:

DB::rollBack();

如果 api 调用运行成功,请运行:

DB::commit();

https://laravel.com/docs/5.6/database#database-transactions(具体见文末人工交易部分)

【讨论】:

  • 谢谢你!你帮了我很多!它只是工作......不知道为什么我自己不这么认为。很简单!
猜你喜欢
  • 1970-01-01
  • 2014-07-13
  • 1970-01-01
  • 2015-07-07
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多