Laravel:使用尝试...使用 DB::transaction() 捕获

2022-08-30 07:10:58

我们都用于多个插入查询。在这样做时,应该将a放在里面还是包裹它?是否有必要包括一个如果出现问题,交易将自动失败的时间?DB::transaction()try...catchtry...catch

包装事务的示例:try...catch

// try...catch
try {
    // Transaction
    $exception = DB::transaction(function() {

        // Do your SQL here

    });

    if(is_null($exception)) {
        return true;
    } else {
        throw new Exception;
    }

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

相反,包装一试...抓住:DB::transaction()

// Transaction
$exception = DB::transaction(function() {
    // try...catch
    try {

        // Do your SQL here

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

});

return is_null($exception) ? true : false;

或者只是一个没有尝试的交易...抓住

// Transaction only
$exception = DB::transaction(function() {

    // Do your SQL here

});

return is_null($exception) ? true : false;

答案 1

如果您需要通过代码手动“退出”交易(无论是通过异常还是只是检查错误状态),则不应使用,而应将代码包装在 /中:DB::transaction()DB::beginTransactionDB::commitDB::rollback()

DB::beginTransaction();

try {
    DB::insert(...);
    DB::insert(...);
    DB::insert(...);

    DB::commit();
    // all good
} catch (\Exception $e) {
    DB::rollback();
    // something went wrong
}

请参阅交易文档


答案 2

如果使用 PHP7,请使用 Throwable in 来捕获用户异常和致命错误。catch

例如:

DB::beginTransaction();

try {
    DB::insert(...);    
    DB::commit();
} catch (\Throwable $e) {
    DB::rollback();
    throw $e;
}

如果您的代码必须与 PHP5 比较,请使用 和 :ExceptionThrowable

DB::beginTransaction();

try {
    DB::insert(...);    
    DB::commit();
} catch (\Exception $e) {
    DB::rollback();
    throw $e;
} catch (\Throwable $e) {
    DB::rollback();
    throw $e;
}

推荐