在Laravel框架中使用数据库事务及案例demo
Laravel  /  管理员 发布于 3年前   909
在我们开始研究 Laravel 的数据库事务之前,让我们先看看它们是什么以及它们如何有益。
对于什么是数据库事务,有许多听起来复杂的技术解释。
但是,对于大多数 web 开发人员来说,我们只需要知道事务是完成数据库中整个工作单元的方式。
换句话说,它 “要么全有,要么全没有”。
事务案例demo
需求描述:
假设我们有一个允许用户注册的应用程序。
每当用户注册时,我们都希望为他们创建一个新帐户,然后为他们分配一个默认角色 “general”。
在 Laravel 中使用数据库事务
现在我们对事务是什么以及它们实现了什么有了一个简单的概念,让我们来看看如何在 Laravel 中使用它们。
在 Laravel 中,由于我们可以在 DB 门面上访问 transaction() 方法,因此开始使用事务实际上是很容易的事。
根据需求描述,让我们看看在创建用户并为其分配角色时如何使用事务:
use Illuminate\Support\Facades\DB;
DB::transaction(function () use ($user, $request): void {
$user = User::create([
'email' => $request->email,
]);
$user->roles()->attach(Role::where('name', 'general')->first());
});
现在我们的代码被包裹在一个数据库事务中,如果在其中的任意一点抛出异常,对数据库的任何更改都将返回到事务开始之前的状态。
在 Laravel 中使用自动或手动事务
同样值得注意的是,因为我们最初的示例使用 DB:transaction() 方法,在抛出异常时回滚事务,所以我们也可以使用这种方法向我们的第三方服务发出请求。
相反,我们可以这样更新类:
use Illuminate\Support\Facades\DB;
use App\Services\ThirdPartyService;
DB::transaction(function () use ($user, $request): void {
$user = User::create([
'email' => $request->email,
]);
$user->roles()->attach(Role::where('name', 'general')->first());
if (! $thirdPartyService->createUser($userData)) {
throw new \Exception('User could not be created');
}
});
这绝对是一个可行的解决方案,并将按照预期成功回滚事务。
事实上,就我个人的偏好而言,我实际上更喜欢这种方式,而不是手动使用事务。
我认为它看起来更容易阅读和理解。
然而,与手动提交或回滚事务时使用 'if' 语句相比,异常处理在时间和性能方面可能会比较昂贵。
因此,举个例子:
如果这段代码用于导入包含 10,000 个用户数据的 CSV 文件,您可能会发现抛出异常会大大减慢导入速度。
但是,如果它只是在一个用户可以注册的简单 web 请求中使用,那么抛出异常可能没有问题。
当然,这取决于应用程序的大小,性能是关键因素;
所以你需要根据具体情况来决定。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号