Laravel中的事务可以用 DB 门面的 transaction 方法在一个事务里执行一系列操作。如果事务闭包里抛出异常,那么事务就会自动回滚。如果闭包执行成功,那么事务就会自动提交。使用 transaction 方法就无需手动回滚或者提交事务了:
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
});
解决死锁
transaction 方法还要第二个参数可供指定——当死锁发生时,事务最大的尝试次数。一旦超过这个指定次数,就会抛出异常:
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
}, 5);
手动使用事务
如果你要完全手动控制事务的回滚和提交,就要用 BD 门面的 beginTransaction 方法了:
DB::beginTransaction();
使用 rollBack 方法回滚事务:
DB::rollBack();
最后,使用 commit 方法提交事务:
DB::commit();