Es gibt viele Möglichkeiten, einen Vogel zu töten. Verschiedene Menschen haben ihre eigenen Methoden, Dinge effektiv zu erledigen. Aus diesem Grund habe ich OPINIONATED zum Thema hinzugefügt. Dies ist meine Art, mehrere Datensätze in mehr als eine Tabelle einzufügen und andere Dienste effektiv auszuführen.
Angenommen, Sie möchten einen Dienst ausführen, der die unten aufgeführten Aufgaben in einem Registrierungscontroller ausführt:
Der Kernpunkt hierbei ist, dass wir mehrere Dienste in einem Controller ausführen und diese alle erfolgreich ausgeführt werden müssen, damit wir kein Problem mit Teiltransaktionen haben.
Eine Teiltransaktion kann als ein Szenario beschrieben werden, in dem nur einige Teile einer Transaktion abgeschlossen werden, was zu Dateninkonsistenz führt.
Wie stellen wir sicher, dass wir dagegen vorgehen?
Wir verwenden die Fassade Datenbanktransaktionen, die uns im Laravel-Framework zur Verfügung steht.
Um eine Datenbanktransaktion auszuführen, müssen wir dem Code-Ausführer mitteilen, dass es sich um eine Datenbanktransaktion handelt.
DB::beginTransaction();
Dann erstellen wir einen try-catch-Block, damit wir Fehler leicht erkennen und das Notwendige tun können. Der Try-Block wird in die Datenbank eingefügt, während der Catch-Block alle aufgetretenen Fehler abfängt.
Für den Inhalt im Block Try haben wir
$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]));
Dann besteht der wichtigste Teil dieses TRY-Blocks darin, diese Änderungen zu übernehmen, wenn alle Dienste erfolgreich ausgeführt werden und eine erfolgreiche Antwort zurückgeben.
DB::commit(); return successResponseHelper('success', "OTP has been sent to your mobile/email, kindly note that OTP validity is 10 minutes");
Wenn alle Dienste in diesem Try-Block erfolgreich sind, speichert der Datenbank-Commit diese Transaktionen in der Datenbank.
Schauen wir uns nun den Blockteil Catch an.
Wenn eine Transaktion/ein Dienst im Block TRY fehlschlägt, gelangt sie zum Catch-Block. Deshalb rufen wir die DB-Fassade erneut auf, um alle in die Datenbank eingefügten Transaktionen wie folgt zurückzusetzen:
DB::rollBack(); return errorResponseHelper('fail', "Operation not successful, please retry");
Die DB::rollBack()-Fassade wird jede Transaktion, die in die Datenbank eingefügt wurde, innerhalb von Millisekunden ohne Probleme rückgängig machen/ein Rollback durchführen.
Dies ist mein Leitfaden gegen Dateninkonsistenzen, insbesondere wenn ich mehr als eine Datenbanktransaktion in Laravel ausführe.
Der vollständige Codeblock:
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"); }
Wenn Sie Fragen haben, zögern Sie nicht, diese zu hinterlassen.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3