首页 > 解决方案 > 如何只提交事务 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 函数中所做的更改应该持续存在。

标签: phpmysqllaravelpdo

解决方案


如果我正确理解了这个问题:

$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();

推荐阅读