杀死一只鸟的方法有很多种。不同的人有其独特的有效做事方式,这就是为什么我在主题中添加了 OPINIONATED,这是我将多条记录插入多个表并有效运行其他服务的方式。
例如,假设您想要运行一个服务来在注册控制器中执行这些未列出的任务:
这里的主要要点是,我们在控制器中运行多个服务,它们必须全部成功运行,这样我们就不会出现部分事务问题。
部分交易可以描述为只完成部分交易的场景,导致数据不一致。
我们如何确保我们能够避免这种情况?
我们使用 Laravel 框架中随时可用的数据库事务外观。
要运行数据库事务,我们需要让代码执行器知道这是一个数据库事务。
DB::beginTransaction();
然后我们创建一个 try-catch 块,这样我们就可以轻松捕获错误并执行需要的操作。 try 块将插入数据库,而 catch 块将捕获遇到的任何错误。
对于Try块中的内容,我们将有
$checkIfUserExists = $userService->userExists($request->email, $request->phoneNumber); if ($checkIfUserExists) return errorResponseHelper('fail', 'User exists!');
$userService->registerUser($request); LogActivity($request->email, $request->phoneNumber);
$generateToken = generateTokenHelper(); $userService->tokenLog($request->email, $generateToken[0]); event(new VerificationTokenDispatch($request->email, $request->PhoneNumber, $generateToken[1]));
然后,此 TRY 块中最重要的部分是在所有服务成功运行并返回成功响应的情况下提交这些更改。
DB::commit(); return successResponseHelper('success', "OTP has been sent to your mobile/email, kindly note that OTP validity is 10 minutes");
如果这个try块中的所有服务都成功,则数据库提交会将这些事务保存到数据库中。
现在让我们看看Catch块部分。
如果事务/服务在 TRY 块中失败,它将到达 catch 块。因此,我们将再次调用 DB 外观来回滚已插入数据库的每个事务,如下所示:
DB::rollBack(); return errorResponseHelper('fail', "Operation not successful, please retry");
DB::rollBack() 外观将在几毫秒内取消保存/回滚已插入数据库的每个事务,不会出现任何问题。
这就是我防止数据不一致的方法,特别是当我在 Laravel 中运行多个数据库事务时。
完整代码块:
use Illuminate\Support\Facades\DB; DB::beginTransaction(); try { $checkIfUserExists = $userService->userExists($request->email, $request->phoneNumber); if ($checkIfUserExists) return errorResponseHelper('fail', 'User exists!'); $registerUser = $userService->registerUser($request); LogActivity($request->email, $request->phoneNumber); $generateToken = generateTokenHelper(); // returns an array, the first is encrypted the second is not $userService->tokenLog($request->email, $generateToken[0]); event(new VerificationTokenDispatch($request->email, $request->PhoneNumber, $generateToken[1])); // both SMS listeners and email listeners are listening to this event DB::commit(); return successResponseHelper('success', "OTP has been sent to your mobile/email, kindly note that OTP validity is 10 minutes"); } catch (\Throwable $th) { DB::rollBack(); return errorResponseHelper('fail', "Operation not successful, please retry"); }
如果您有任何疑问,请随时提出。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3