【问题标题】:How do Nested Transactions work in Laravel?嵌套事务如何在 Laravel 中工作?
【发布时间】:2019-05-07 12:12:53
【问题描述】:

我有一个主函数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();
            }
        }

【问题讨论】:

  • 您必须重新抛出异常,以便它们被 A 捕获。
  • 应该是:DB::beginTransaction() 函数A; DB::beginTransaction();功能B; $modelB->保存(); DB::commit() 函数 B; DB::beginTransaction() 函数 C;抛出异常函数 C; DB::rollback() 函数 C; DB::rollback() 函数 A;正确的?变量 $modelB 它的行为如何?保存了吗?

标签: php mysql laravel transactions


【解决方案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;
    }

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多