Laravel DB:: transaction() возвращаемое значение

Это мой первый раз использовать DB::transaction(), но как именно он работает, если транзакция терпит неудачу или будет успешной? В приведенном ниже примере мне нужно вручную присвоить значение для возврата true, или если он завершится с ошибкой, метод вернет false или полностью выйдет из транзакции (поэтому пропуская остальную часть кода)? Документы не так полезны.

use Exception;
use DB;

try {
    $success = DB::transaction(function() {
        // Run some queries
    });

    print_r($success);

} catch(Exception $e) {
    echo 'Uh oh.';
}

Решение

Я записал это решение для других, которым может быть интересно.

Поскольку я больше беспокоился о возврате логического значения в зависимости от успеха моего запроса, с несколькими изменениями он теперь возвращает true/false в зависимости от его успеха:

use Exception;
use DB;

try {
  $exception = DB::transaction(function() {
    // Run queries here
  });

  return is_null($exception) ? true : $exception;

} catch(Exception $e) {
    return false;
}

Обратите внимание, что переменная $exception никогда не возвращается, так как если что-то пойдет не так с вашим запросом, catch немедленно запускается, возвращая false. Спасибо @ilaijin за то, что объект Exception вызывается, если что-то пойдет не так.

Ответ 1

Просматривая function transaction, он выполняет свой процесс внутри блока try/catch

public function transaction(Closure $callback)
{
    $this->beginTransaction();

    // We'll simply execute the given callback within a try / catch block
    // and if we catch any exception we can rollback the transaction
    // so that none of the changes are persisted to the database.
    try
    {
        $result = $callback($this);

        $this->commit();
    }

    // If we catch an exception, we will roll back so nothing gets messed
    // up in the database. Then we'll re-throw the exception so it can
    // be handled how the developer sees fit for their applications.
    catch (\Exception $e)
    {
        $this->rollBack();

        throw $e;
    }

Таким образом, выдает исключение (после отката), если он не работает или возвращает $result, что является результатом вашего обратного вызова

Ответ 2

Вы также можете использовать следующие

DB::rollback();