事务

如果您不熟悉数据库事务,那么它们是一个工具,它允许您将要执行的一系列数据库查询打包成一批,您可以选择回滚,撤消整个查询。事务通常用于确保执行一系列相关查询的全部而非部分,如果一个失败,ORM将回滚整个查询

Laravel查询事务特性是,如果在事务关闭前有异常,则事务中所有查询都将回滚,如果事务成功完成,则会提交所有查询并不回滚

让我们示例5-16事务的简单例子

DB::transaction(function () use ($userId, $numVotes) { 
    // Possibly failing DB query
    DB::table('users')
        ->where('id', $userId)
        ->update(['votes' => $numVotes]);

    // Caching query that we don't want to run if the above query fails
    DB::table('votes')
        ->where('user_id', $userId)
        ->delete();
});

在这个例子中,我们假设之前进行了一些操作:汇总了用户的投票总数,我们希望缓存这个数字到用户表,然后从投票表清除这些投票,但是,当然,在成功运行对用户表的更新之前,我们不希望清除投票。如果清除投票表失败,我们不想在用户表中保留更新的投票数。

如果两个查询中有任何问题,则不会应用另一个查询。这就是数据库事务的魔力。

请注意,您还可以手动开始和结束事务,这适用于查询器和Eloquent查询。以DB::beginTransaction()开始,以DB::commit()结束,并以DB::rollBack()回滚

DB::beginTransaction();
// Take database actions
if ($badThingsHappened) { 
    DB::rollBack();
}
// Take other database actions
DB::commit();

Last updated