Php 数据库事务Laravel未回滚

Php 数据库事务Laravel未回滚,php,laravel,Php,Laravel,如果满足某个条件,我将尝试使用Laravel DB facade回滚数据库事务。但是我的回滚不起作用 首先,我用DB::beginTransaction()启动了我的DB事务 其次,我编写了查询以创建以下内容: 创建新的付款批次 创建付款批记录 创建付款审批 创建付款审批人 第三,我然后做了一些条件,以知道何时回滚或提交我的DB事务。但是,回滚不起作用。示例我的代码中满足了此条件块,但从未回滚 if(!$mail_status){ DB::rollBack(); return ba

如果满足某个条件,我将尝试使用Laravel DB facade回滚数据库事务。但是我的回滚不起作用

首先,我用
DB::beginTransaction()启动了我的DB事务

其次,我编写了查询以创建以下内容:

  • 创建新的付款批次
  • 创建付款批记录
  • 创建付款审批
  • 创建付款审批人
  • 第三,我然后做了一些条件,以知道何时回滚或提交我的DB事务。但是,回滚不起作用。示例我的代码中满足了此条件块,但从未回滚

    if(!$mail_status){
       DB::rollBack();
        return back()->with('error', 'Mail not send to approvers. Try again or contact system administrator.');
    }
    
    下面是完整的代码块

    //Start transaction
        DB::beginTransaction();
    
        try{
    
            //Run Queries
    
            //Create a new payment batch
            $batch = Batch::create([
                'uuid' => uniqid(),
                'batch_name' => $batch_config->batch_name,
                'service_code' => Auth::user()->service_code,
                'created_by' => Auth::user()->name,
            ]);
    
            //Create parameters for new payment batch record
            foreach($batch_record_config as $data){
                $record[] = [
                    'batch_id' => $batch->batch_id,
                    'payee_name' => $data['payee_name'],
                    'bank_id' => $data['bank_id'],
                    'bank_name' => $data['bank_name'],
                    'account_type' => $data['account_type'],
                    'account_number' => $data['account_number'],
                    'amount' => $data['amount'],
                    'description' => $data['description'],
                    'year' => date("Y"),
                    'month' => date("F", mktime(0, 0, 0, date("n"), 10)),
                    'uuid' => uniqid(),
                    'service_code' => Auth::user()->service_code,
                    'created_at' => now(),
                    'created_by' => Auth::user()->name,
                ];
            }
            $batch_record_status = DB::table('batch_record')->insert($record);
    
            //Generate new payment approval
            $payment_approval = PaymentApproval::create([
                'uuid' => uniqid(),
                'batch_id' => $batch->batch_id,
                'service_code' => Auth::user()->service_code,
                'created_by' => Auth::user()->name,
                'deleted' => 0,
            ]);
    
            //Generate payment approvers for the payment approval
            $payment_approvers = [];
            foreach($approval_users as $data){
                $payment_approvers[] = [
                    'uuid' => uniqid(),
                    'payment_approval_id' => $payment_approval->id,
                    'approval_user_id' => $data->id,
                    'approval_level_id' => $data->approval_level_id,
                    'batch_id' => $batch->batch_id,
                    'approval_position_value' => $data->approval_level->approval_position,
                    'approval_level_name' => $data->approval_level->approval_level,
                    'user_id' => $data->user_id,
                    'batch_name' => $batch->batch_name,
                    'service_code' => Auth::user()->service_code,
                    'approved' => 0,
                    'deleted' => 0,
                    'created_at' => now(),
                    'created_by' => Auth::user()->name,
                ];
            }
            $payment_approvers_status = DB::table('payment_approvers')->insert($payment_approvers); 
    
    
            // If DB transcation is successful.
            if($batch && $batch_record_status && $payment_approval && $payment_approvers_status){
    
                //get the next approvers
                $next_approvers = $this->next_approvals($payment_approval->id);
    
                if($next_approvers){
                    //send mail to the next approvers
                    $mail_status = $this->send_approvers_mail($next_approvers,$batch);
                    if(!$mail_status){
                        DB::rollBack();
                        return back()->with('error', 'Mail not send to approvers. Try again or contact system administrator.');
    
                    }else{
                        DB::commit();
                        return back()->with('success', 'Batch has being initialized');
                    }
                }else{
                    DB::rollBack();
                    return back()->with('error', 'Approvers not found. Try again or contact system administrator.');
                }  
    
            }else{
                DB::rollBack();
                return back()->with('error', 'Something went wrong. Try again.');
            }
    
    
    
        }catch(\Exception $e){
            DB::rollBack();
            dd($e);
            return back()->with('error', 'Something went wrong... Contact system administrator. Thanks.');
        }
    

    您没有提到DB get commit或抛出一些错误?请检查邮件函数响应中的内容。我认为您在邮件中获得了成功,因为您的else条件是不执行任何案例。

    我查看了您的,正如其他人正确指出的,您需要提交事务。我在你的代码里看不到。据我所知,基本上有两种使用事务的方法。 1.

    二,

    如果您使用的是第二种方法,则不必进行任何提交,失败时将自动回滚

    我想这是你这一行的错误 $next\u approvers=$this->next\u approvals($payment\u approval->id); 我找不到代码中定义的*next_approvals8属性,而且您正在使用Laravel ORM和Raw语句(PaymentApproval::create&DB::table('batch_record')->insert($record);)


    尝试坚持使用1,看看是否有效。

    您需要提交
    DB::commit()并使用
    DB::beginTransaction()在try部分中有一个DB::commit();在检查邮件是否成功的条件内。我还尝试包括DB::BeginTransaction();在try-catch内,但也不起作用。
    DB::beginTransaction
    调用不需要在try/catch块内,不用担心。哪个回滚不工作?所有回滚都不工作。如果邮件不成功,我更感兴趣。
    \DB::beginTransaction();
        try {
            DB::table('users')->update(['votes' => 1]);
            DB::table('posts')->delete();
        } catch (\Exception $e) {
            $count = 0;
            \DB::rollBack();
            \Log::info(self::LOG_PREFIX . 'Some Msg ', [$e->__toString()]);
        }
    
        \DB::commit();
    
    DB::transaction(function () {
            DB::table('users')->update(['votes' => 1]);
            DB::table('posts')->delete();
        });