首页 > 解决方案 > Laravel 7.x 数据库事务自动提交,没有 commit() 命令

问题描述

我有一个使用查询生成器将记录插入数据库的函数。我想手动使用事务。

但是记录被插入数据库而不调用该commit()函数。我不知道为什么;我想让插入函数等我调用该commit()函数。

在我的脚本中有 2 个命令:

  1. 插入products(正确的命令)

  2. 插入product_categories(无效命令 - 我设置字段prd_idd而不是prd_id

在这种情况下,我希望命令 #1 在 #2 失败时不会插入到数据库中。

public function create($params)
{
    DB::beginTransaction();
    try {
        DB::table('products')->insert($params);
        DB::table('prd_categories')->insert(['prd_idd'=> 1, 'category_id' => 1]);
    } catch (\Exception $ex) {
        echo $ex->getMessage();
        DB::rollback();
    }
    die("End");
}

标签: laraveltransactionscommitrollbackautocommit

解决方案


要在数据库中运行一组操作transaction,您可以使用DB外观上的事务方法。如果事务中抛出异常Closure,事务将自动回滚。如果Closure成功执行,事务将自动提交。transaction使用该方法时无需担心手动回滚或提交:

DB::transaction(function () {
    DB::table('product')->insert(...);
    DB::table('prd_categories')->insert(...);
});

推荐阅读