php - Laravel:使用 try...catch 和 DB::transaction()

标签 php laravel transactions

我们都使用 DB::transaction() 进行多次插入查询。在这样做时,应该将 try...catch 放在其中还是包装它?如果出现问题,事务会自动失败,是否还需要包含 try...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() 包装了一个 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;

或者只是一个没有 try...catch 的事务

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

    // Do your SQL here

});

return is_null($exception) ? true : false;

最佳答案

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

DB::beginTransaction();

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

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

transaction docs .

关于php - Laravel:使用 try...catch 和 DB::transaction(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22906844/

相关文章:

laravel - 如何获取授权用户的Laravel模型?

database - Laravel DB::rollback() 不适用于交易流程

java - 在 JPA 中, native 查询是否发生回滚?

mongodb - MongoDB中的序列化 "isolation level",或者丢失更新问题

php - Laravel 5.5 和子域 session ?

php - 如何获得 laravel orm 的最后增量?

php - ajax运行mysql查询并检查mysql查询是真还是假?

PHP。亚马逊 S3 签名 V4。简单的例子

php - mysql:对结果进行分组,限制它们并在一个查询中连接到其他表

php - 在 laravel 8 中使用 Mailjet smtp 发送邮件