我正在使用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;
}
我的预期如下:
但正在发生的事情如下。
它看起来像嵌套的“\ DB :: commit();”在逻辑上不起作用。 如何在Laravel上处理嵌套事务?
如果不可能,那么这个案例的最佳做法是什么? 大多数情况下,我想在异常导致时提交正常结束和回滚(不为每个逻辑编写代码),但偶尔也要为特定逻辑手动提交或回滚。
答案 0 :(得分:0)
具体针对您的用例,您可以使用以下技巧,但我本人不推荐这样做:
1)在您的中间件中,您有类似以下内容:
DB::beginTransaction();
... {
DB::commit();
} ... {
DB::rollBack();
}
2)由于您希望代码的行为类似于检查点,因此您可以编写如下代码作为检查点:
...
DB::commit();
DB::beginTransaction();
...
因此,每当遇到检查点时,原始事务都会被提交,新事务将在此之后立即开始。希望它能实现您想要的...