Laravel Транзакция: Как сделать коммит некоторых запросов вместо отката всех? - PullRequest
1 голос
/ 30 апреля 2020

Блок транзакции при исключении отменяет запрос, так что откат. Но теперь, когда возникают исключения, нужно хранить данные - подробности исключения в таблице. При отмене запроса запрос вставки / обновления также получает откат.

\DB::transaction(function () use ($request) {
    try{
        // operations
    }catch(Exception $e){
        $exception_model = new ExceptionModel();
        $exception_model->user = $request->user_info;
        $exception_model->detail = $e;
        $exception_model->save();

        abort(Response::HTTP_BAD_REQUEST, 'Something went wrong');
    }
});

Но, поскольку он автоматически откатывается (ie., laravel закрытие транзакции), модель исключения также меняет откат. Как это можно сделать?

Ответы [ 2 ]

2 голосов
/ 30 апреля 2020

Вы можете использовать транзакции вручную вне замыканий. Таким образом, вы сможете хранить данные в своих $exception_model:

    try{
        DB::beginTransaction(); //Initiate transaction
        // operations
        DB::commit(); //Commit transaction after all the operations
    }catch(Exception $e){
        DB::rollBack(); //Rollback if the exception occurs, but still save data  in your exception model
        $exception_model = new ExceptionModel();
        $exception_model->user = $request->user_info;
        $exception_model->detail = $e;
        $exception_model->save();

        abort(Response::HTTP_BAD_REQUEST, 'Something went wrong');
    }

Подробнее об официальной документации , в сегменте Вручную с использованием транзакций

1 голос
/ 30 апреля 2020

Помещение транзакции внутри блока try должно работать:

use Exception;

try {
    \DB::transaction(function () use ($request) {
        // operations
    });
} catch (Exception $e) {
    $exception_model = new ExceptionModel();
    $exception_model->user = $request->user_info;
    $exception_model->detail = $e;
    $exception_model->save();

    abort(Response::HTTP_BAD_REQUEST, 'Something went wrong');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...