php - 如何只提交事务 PHP 的一部分?
问题描述
我需要一些想法来解决需要更新订单以及为此订单创建付款的问题。但是如果订单收费失败。对订单所做的更新应该被撤消,但对其产生的费用应该保持不变。
示例控制器代码:
$order = Order::find(1);
DB::beginTransaction();
try {
$order->update(['status' => 1]);
chargeOrder ($order);
} catch (PaymentErrorException $e) {
DB::rollback();
throw $e;
}
catch (\Exception $e) {
DB::rollback();
throw $e;
}
DB::commit();
使订单收费的示例函数:
function chargeOrder( $order ) {
$payments_service->charge($order);
$order->payments()->create( new Payment() );
}
我需要的是,当发生 PaymentErrorException 时,只有 $order->update() 应该被撤消,但在chargeOrder 函数中所做的更改应该持续存在。
解决方案
如果我正确理解了这个问题:
$order = Order::find(1);
$previousStatus = $order->status;
DB::beginTransaction();
try {
$order->update(['status' => 1]);
chargeOrder ($order);
} catch (PaymentErrorException $e) {
$order->update(['status' => $previousStatus]);
}
catch (\Exception $e) {
DB::rollback();
throw $e;
}
DB::commit();
推荐阅读
- javascript - 如何一次替换多个字符串实例?
- c# - C# 使用 PostAsync 发送时,JSON“Plain”神奇地出现在接收方的 JSON 顶部
- java - 如何更改部落浮动操作菜单的状态?
- ruby-on-rails - Ruby reverse.each_with_index 和 delete_at 在最新的 Ruby/Rails 中导致问题
- python - jupyter notebook 丢失了导入
- python - 如何在 azure 上运行基于 python3.7 的烧瓶 web api
- java - 与 OpenJDK 相比,Oracle 的商业 Hotspot JVM 有哪些性能优势?
- wordpress - 使用 Genesis 的 Wordpress 多站点中的 Cookie
- django - Django 休息框架 RetrieveAPIView 不工作:404
- ios - iOS TableView 搜索时自动拖动