殺死一隻鳥的方法有很多種。不同的人有其獨特的有效做事方式,這就是為什麼我在主題中添加了 OPINIONATED,這是我將多條記錄插入多個表並有效運行其他服務的方式。
例如,假設您想要執行一個服務來在註冊控制器中執行這些未列出的任務:
這裡的主要要點是,我們在控制器中運行多個服務,並且它們必須全部成功運行,這樣我們就不會出現部分事務問題。
部分交易可以描述為只完成部分交易的場景,導致資料不一致。
我們如何確保我們能夠避免這種情況?
我們使用 Laravel 框架中隨時可用的 資料庫事務外觀。
要執行資料庫事務,我們需要讓程式碼執行器知道這是一個資料庫事務。
DB::beginTransaction();
然後我們建立一個 try-catch 區塊,這樣我們就可以輕鬆捕獲錯誤並執行需要的操作。 try 區塊將插入資料庫,而 catch 區塊將捕獲遇到的任何錯誤。
對於嘗試區塊中的內容,我們將有
$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"); }
如果您有任何疑問,請隨時提出。
以上是自以為是:如何在 Laravel 中安全地將多筆記錄插入多個表中的詳細內容。更多資訊請關注PHP中文網其他相關文章!