2026-10-21 13:29:08
在 Laravel 中,可通过 DB 门面的 beginTransaction()、commit() 和 rollback() 方法手动管理数据库事务,确保数据一致性。以下是具体实现步骤和注意事项:
1. 开启事务在控制器或服务类中引入 DB 门面,调用 beginTransaction() 开启事务:
use IlluminateSupportFacadesDB;DB::beginTransaction();开启后,所有后续数据库操作(如 Eloquent 模型操作、查询构建器等)均处于事务中,直到显式提交或回滚。
2. 执行数据库操作并提交在事务中执行操作,确认无误后调用 commit() 提交事务。建议使用 try-catch 块捕获异常,确保异常时回滚:
try { DB::beginTransaction(); // 示例操作:创建用户和订单 $user = User::create([ 'name' => 'John', 'email' => 'john@example.com' ]); $order = Order::create([ 'user_id' => $user->id, 'amount' => 100 ]); // 提交事务 DB::commit();} catch (Exception $e) { // 回滚事务 DB::rollback(); throw $e; // 可根据需求处理异常(如记录日志、返回错误响应)}关键点:
若事务中发生异常(如数据库操作失败、业务逻辑验证不通过),需在 catch 块中调用 rollback() 回滚所有更改:
try { DB::beginTransaction(); // 示例操作:转账逻辑 $userA = User::find(1); $userB = User::find(2); $userA->balance -= 100; $userB->balance += 100; $userA->save(); $userB->save(); // 模拟异常(如余额不足) if ($userA->balance < 0) { throw new Exception('余额不足'); } DB::commit();} catch (Exception $e) { DB::rollback(); Log::error('事务回滚: ' . $e->getMessage()); // 记录日志 return response()->json(['error' => '操作失败'], 500);}手动回滚场景:
若逻辑简单,可直接使用 DB::transaction() 自动管理事务(内部已封装 begin/commit/rollback):
DB::transaction(function () use ($userData, $orderData) { $user = User::create($userData); Order::create(array_merge($orderData, ['user_id' => $user->id]));});适用场景:无需精细控制事务的简单操作。
总结通过以上方法,可安全地在 Laravel 请求中手动管理事务,保障数据一致性。