2026-10-22 22:43:51
在 Laravel 中,使用数据库事务可以确保多个数据库操作要么全部成功,要么全部回滚,从而保证数据一致性。以下是具体的使用方法:
一、使用 DB::transaction 自动处理事务通过 DB::transaction 方法,Laravel 会自动处理事务的开启、提交或回滚。当闭包内的代码抛出异常时,系统会自动回滚事务。
在控制器或服务类中引入 DB Facade:use IlluminateSupportFacadesDB;
将涉及多个表的数据操作放入 DB::transaction 的闭包中:DB::transaction(function () { DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete();});
如果闭包内部发生异常(如数据库约束冲突或手动抛出异常),所有操作都会被回滚。
当需要更精细地控制事务流程时,可以使用 DB::beginTransaction()、DB::commit() 和 DB::rollBack() 手动管理事务状态。
开始事务前调用 DB::beginTransaction():DB::beginTransaction();
在 try 块中执行数据库操作:try { DB::table('users')->create(['name' => 'John']); DB::table('logs')->create(['action' => 'user_created']); DB::commit(); // 提交事务}
在 catch 块中进行回滚处理:catch (Exception $e) { DB::rollBack(); // 回滚事务 throw $e;}
当 Eloquent 模型触发保存、更新等事件时,可以将其纳入事务范围,以确保关联逻辑的数据一致性。
在模型的观察者或控制器方法中启动事务:DB::transaction(function () { $user = User::create(['name' => 'Alice']); $user->profile()->create(['bio' => 'Developer']);});
如果创建 profile 失败,user 记录也将被回滚,避免出现孤立数据。
适用于一对多、多对多关系的批量写入场景。
Laravel 支持模拟嵌套事务,通过 savepoint 实现部分回滚而不影响外层事务的整体控制。
在外层事务中调用 DB::transaction 开启主事务:DB::transaction(function () { DB::table('orders')->insert([...]);});
在内部逻辑中再次调用 DB::transaction,框架会自动使用 savepoint:DB::transaction(function () { DB::table('order_items')->insert([...]);}, 5); // 第二个参数为重试次数
内部事务失败仅回滚到该点,不影响外部已执行的操作流。
通过以上方法,可以灵活地在 Laravel 中使用数据库事务来保证数据的一致性。