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

首先,我用DB::beginTransaction();开始了我的数据库事务DB::beginTransaction();

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

  1. 创建新的付款批次
  2. 创建付款批记录
  3. 创建付款审批
  4. 创建付款审批人

第三,我做了一些条件来知道何时回滚或提交我的数据库事务。 但是回滚不起作用。 例如,我的代码中满足了这个条件块,但从未回滚

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.');
    }

#1楼 票数:0

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

\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();

2.

DB::transaction(function () {
        DB::table('users')->update(['votes' => 1]);
        DB::table('posts')->delete();
    });

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

我认为错误在你的这一行中$next_approvers = $this->next_approvals($payment_approval->id); 我找不到在您的代码中定义的 *next_approvals8 属性,另外您同时使用 Laravel ORM 和 Raw Statements (PaymentApproval::create & DB::table('batch_record')->insert($record);)

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

#2楼 票数:-1

你没有提到你的数据库得到提交或抛出一些错误?。检查你在邮件功能响应中得到了什么。 我认为您在邮件中取得了成功,因为您的 else 条件在任何情况下都不执行。

  ask by Hyginus translate from so

未解决问题?本站智能推荐:

2回复

Laravel事务不回滚

尝试这样的事情: 当$another->value的验证异常抛出时, $another不会保存并且$model仍保存在数据库表中。 mysql: 5.6.21 表:InnoDB
2回复

没有数据库异常发生时Laravel事务不会回滚

这是我的代码: 创建候选徽章时发生异常: $this->createCandidateBadge 但是,当我看到user_certificates表时,就创建了一个证书! 除非成功创建了徽章,否则我不想在数据库中创建证书!
1回复

Laravel4.2-多个数据库的事务回滚问题

我在回滚涉及来自多个数据库的表的事务时遇到了问题。 主表回滚按预期运行,但子行仍然存在,现在是孤立的。 看起来像这样:
1回复

Laravel数据库事务

我有一个很奇怪的问题。 我正在尝试使用phpunit在我的api中测试以下功能。 这将返回状态码500。但是当我删除use DatabaseTransaction它正在工作! 在我的config/database.php我已将默认设置为测试连接'default' => env('D
4回复

Laravel回滚特定的数据库

我尝试使用php artisan migrate:rollback --database='system'回滚我的数据库系统php artisan migrate:rollback --database='system' 但似乎并不能像php artisan migrate --databa
1回复

具有多次提交的Laravel数据库事务?

我可以在 DB 事务期间做一些检查点吗? 比如事务开始的时候,我有很多查询、更新、删除等等。 据我了解,这种功能会在成功的情况下自动提交所有内容,如果出现问题则回滚。 但是是否有可能在出现错误时不回滚所有内容,例如 是否存在任何“小的内部提交”?
1回复

Codeception不会回滚Laravel5中的数据库更改吗?

我是Codeception的新手,并且正在使用它来测试在laravel 5中创建的Web服务。因此,我的主要配置文件如下所示: 代码接收 名为api.suite.yml的套件文件如下所示: 我也将数据库carparts的整个转储粘贴到了dump.sql文件中,但是仍然在运行测试时,仍
1回复

运行laravel可以阐明laravel外部的数据库事务

$ dbc->的BeginTransaction(); 给我这个错误, 谁能为我提供一些有关如何在laravel之外使用胶囊和数据库事务的帮助。 我找不到任何暗示不起作用的信息?