嵌套事务在 Laravel 中如何工作?

Lui*_*sci 6 php mysql transactions laravel

我有一个主函数A,在函数B之前和函数C之后调用。两者都保存一个模型,并且在函数A中都有自己的开始事务和主事务,数据如何存储?

我试图在函数 C 上抛出异常,但函数 B 在任何地方存储变量 $modelB

        public function B(){
            DB::beginTransaction();
            try{
            $modelB->save();
                DB::commit();
            }catch(\Exception $e){
                DB::rollback();
            }
        }

        public function C(){
            DB::beginTransaction();
            try{
            $modelC->save();
                DB::commit();
            }catch(\Exception $e){
                DB::rollback();
            }
        }

        public function A(){
            DB::beginTransaction();
            try{
                $this->B();
                $this->C();
                DB::commit();
            } catch(\Exception $e){
                DB::rollback();
            }
        }
Run Code Online (Sandbox Code Playgroud)

小智 1

在 Laravel 6 中你可以使用:

DB::connection(DB::getDefaultConnection())->transactionLevel()
Run Code Online (Sandbox Code Playgroud)

获取当前活跃交易数量。就我个人而言,我更喜欢使用单一事务,例如:

if(DB::connection(DB::getDefaultConnection())->transactionLevel()==0){
    DB::beginTransaction();
}
    try{
        //DO SOME STUFF

        if(DB::connection(DB::getDefaultConnection())->transactionLevel()==0)
        {
            DB::commit();
        }  // else, leave commit to parent transaction
    }catch(\Throwable $e)
    {
        DB::rollback();
        throw $e;
    }
Run Code Online (Sandbox Code Playgroud)