Транзакция БД Laravel не откатывается - PullRequest
0 голосов
/ 21 февраля 2020

Я пытаюсь использовать Laravel Фасад БД для отката транзакций в моей базе данных, если выполняется определенное условие. Но мой откат не работает.

Сначала я начал свою транзакцию БД с 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.');
    }

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

Я посмотрел на вас, и, как другие правильно указали, вам нужно совершить транзакции. Что я не вижу в вашем коде. Есть два основных способа использования транзакций, которые мне известны. 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 и необработанные операторы (PaymentApproval :: create & DB :: table ('batch_record') -> insert ($ record);)

Попробуйте придерживаться значения 1 и посмотрите, работы.

0 голосов
/ 21 февраля 2020

Вы не упомянули, что либо ваша БД получает коммит, либо выдает какую-то ошибку? Проверьте, что вы получаете в ответе почтовой функции. Я полагаю, вы добились успеха в почте, потому что ваше условие else не выполняется ни в одном случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...