Laravel嵌套事务无效

时间:2017-08-15 13:28:14

标签: laravel laravel-5 transactions eloquent

我正在使用Laravel 5.2并希望实现嵌套事务。

[中间件] - 适用于所有逻辑,正常结束时提交和异常引起时回滚

wx-config

[逻辑] - 嵌套交易

public function handle($request, Closure $next)
{
    \DB::beginTransaction();
    try {
        $response = $next($request);
    } catch (\Exception $e) {
        \DB::rollBack();
        throw $e;
    }
    if ($response instanceof Response && $response->getStatusCode() > 399) {
        \DB::rollBack();
    } else {
        \DB::commit();
    }
    return $response;
}

我的预期如下:

  1. modelA inserted
  2. modelA提交
  3. modelB inserted
  4. modelB rollbacked
  5. 但正在发生的事情如下。

    1. modelA inserted
    2. modelB inserted
    3. modelA和modelB rollbacked
    4. 它看起来像嵌套的“\ DB :: commit();”在逻辑上不起作用。 如何在Laravel上处理嵌套事务?

      如果不可能,那么这个案例的最佳做法是什么? 大多数情况下,我想在异常导致时提交正常结束和回滚(不为每个逻辑编写代码),但偶尔也要为特定逻辑手动提交或回滚。

1 个答案:

答案 0 :(得分:0)

具体针对您的用例,您可以使用以下技巧,但我本人不推荐这样做:

1)在您的中间件中,您有类似以下内容:

DB::beginTransaction();
... {
    DB::commit();
} ... {
    DB::rollBack();
}

2)由于您希望代码的行为类似于检查点,因此您可以编写如下代码作为检查点:

...
DB::commit();
DB::beginTransaction();
...

因此,每当遇到检查点时,原始事务都会被提交,新事务将在此之后立即开始。希望它能实现您想要的...