laravel 数据库事务上下文在被调用函数上可用

laravel db transaction context is available on called functions

我发现要在 Laravel 中使用 DB::transaction,结合 ORM,我们需要 运行 像这样的东西:

DB::transaction(function() {
      //
   Model::create($something);
});

我的问题是: 如果我需要从闭包内部调用其他函数,即 运行 的其他创建方法,将在“事务”环境中还是在外部?

DB::transaction(function() {
      //
   ModelX::create($something);
   $this->somefunction($data);
});

private function somefunction($data){

    ModelY::create($data) <----this create is in the transaction or do I need a new one for having rollback in case of errros?

}

请记住,您的代码可以使用任何不会 return 重定向的额外 functions/methods。这将跳过 commit() 或 rollback()。一旦 beginTransaction() 开始,它必须以 commit() 或 rollback() 结束。

    DB::beginTransaction();
    try {
       /* your code */
       /* you can also use DB::commit(); at the end of TRY code like this */
    } catch (\Exception $ex) {
       DB::rollback();
       /* handle error */
       /* use return after rollback() */
    }
    DB::commit();

    /* use return after commit(); */

经过几次测试,我可以告诉模型也不需要闭包,即使您在另一个函数中有一个创建方法,并且抛出异常 - 在主函数或函数中 - 回滚和提交声明! 好吧,我希望的更多!!!!

这是我测试的代码:

   DB::beginTransaction();
        try {
            $this->pippo();
        } catch (\Exception $ex) {
            DB::rollback();
        }
   DB::commit();

public function pippo(){
    $type=Cga_type::create(['name'=>'vvvv','description'=>'yyy']);
    throw new Exception('error');

}

如果我评论交易功能,记录将写入数据库,否则不会!!!