php – Laravel:使用try … catch与DB :: transaction()

我们都使用DB :: transaction()来进行多次插入查询。在这样做的时候,应该尝试…抓住放在里面或包装吗?甚至有必要包括一个try … catch当一个事务会自动失败,如果出了问题?

 

示例try …抓住包装事务:

 

// 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()包装一个try … catch:

 

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

        // Do your SQL here

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

});

return is_null($exception) ? true : false;

或者简单的一个交易w / o一个尝试…抓住

 

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

    // Do your SQL here

});

return is_null($exception) ? true : false;
 
在这种情况下,您需要通过代码(通过异常或简单地检查错误状态)手动“退出”事务,您不应该使用DB :: transaction(),而是将代码包装在DB :: beginTransaction和DB中::提交/ DB ::回滚():

 

 

DB::beginTransaction();

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

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

transaction docs

posted @ 2021-04-14 17:40  endkoo  阅读(818)  评论(0编辑  收藏  举报