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 „Meinung“ 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 folgenden unten aufgeführten Aufgaben in einem Registrierungscontroller ausführt:
Der Kernpunkt hier ist, dass wir mehrere Dienste in einem Controller ausführen und sie 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 dem entgegenwirken?
Wir verwenden die Datenbanktransaktionen-Fassade, 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 die Inhalte im Block Ausprobieren 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.
Jetzt schauen wir uns den Blockteil Catch an.
Wenn eine Transaktion/ein Dienst im TRY-Block fehlschlägt, kommt es zum Catch-Block. Deshalb rufen wir die DB-Fassade erneut auf, um jede Transaktion, die in die Datenbank eingefügt wurde, 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, uns zu kontaktieren.
Das obige ist der detaillierte Inhalt vonMeinung: So fügen Sie mehrere Datensätze sicher in mehr als eine Tabelle in Laravel ein. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!