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

时间:2019-05-07 12:12:54

标签: php mysql laravel transactions

我有一个在函数B之前和在函数C之后调用的主函数A。两者都保存一个模型,并且在函数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();
            }
        }

1 个答案:

答案 0 :(得分:1)

在Laravel 6中,您可以使用:

DB::connection(DB::getDefaultConnection())->transactionLevel()

获取当前活动交易号。我个人更喜欢使用单笔交易,例如:

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;
    }