Terdapat banyak cara untuk membunuh burung. Orang yang berbeza mempunyai cara unik mereka untuk melakukan sesuatu dengan berkesan, itulah sebabnya saya menambahkan PENDAPAT pada topik, ini adalah cara saya untuk memasukkan berbilang rekod ke lebih daripada satu jadual dan menjalankan perkhidmatan lain dengan berkesan.
Sebagai contoh, katakan anda ingin menjalankan perkhidmatan yang melakukan tugasan yang tidak disenaraikan dalam pengawal pendaftaran:
Intipati utama di sini ialah kami menjalankan berbilang perkhidmatan dalam pengawal dan semuanya mesti berjalan dengan jayanya supaya kami tidak mempunyai isu Transaksi Separa.
Satu Transaksi Separa boleh dihuraikan sebagai senario di mana hanya beberapa bahagian transaksi diselesaikan, yang membawa kepada ketidakkonsistenan data.
Bagaimanakah kami memastikan kami memberi panduan terhadap perkara ini?
Kami menggunakan fasad Transaksi Pangkalan Data yang tersedia untuk kami dalam rangka kerja Laravel.
Untuk menjalankan transaksi pangkalan data, kami perlu memberitahu pelaksana kod mengetahui ini adalah transaksi pangkalan data.
DB::beginTransaction();
Kemudian kami mencipta blok cuba-tangkap supaya kami dapat menangkap ralat dengan mudah dan melakukan yang perlu. Blok cuba akan dimasukkan ke dalam pangkalan data manakala blok tangkapan akan menangkap sebarang ralat yang dihadapi.
Untuk kandungan dalam blok Cuba, kami akan ada
$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]));
Kemudian, bahagian paling penting dalam blok TRY ini ialah melakukan perubahan ini jika semua perkhidmatan berjalan dengan jayanya dan mengembalikan respons yang berjaya.
DB::commit(); return successResponseHelper('success', "OTP has been sent to your mobile/email, kindly note that OTP validity is 10 minutes");
Jika semua perkhidmatan dalam blok percubaan ini berjaya, komit pangkalan data akan menyimpan transaksi ini ke dalam pangkalan data.
Sekarang Mari kita lihat bahagian blok Tangkap.
Jika transaksi/perkhidmatan gagal dalam blok CUBA, ia akan datang ke blok tangkapan. Jadi kami akan memanggil fasad DB sekali lagi untuk melancarkan semula setiap transaksi yang telah dimasukkan ke dalam pangkalan data seperti:
DB::rollBack(); return errorResponseHelper('fail', "Operation not successful, please retry");
Fasad DB::rollBack() tidak akan menyimpan/mengembalikan setiap transaksi yang telah dimasukkan ke dalam pangkalan data tanpa masalah dalam milisaat.
Inilah cara saya membimbing terhadap ketidakkonsistenan data terutamanya apabila saya menjalankan lebih daripada satu transaksi pangkalan data dalam Laravel.
Blok kod penuh:
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"); }
Jika anda mempunyai sebarang soalan, jangan teragak-agak untuk melepaskannya.
Atas ialah kandungan terperinci Pendapat: Cara untuk memasukkan berbilang rekod dengan selamat ke lebih daripada satu jadual dalam Laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!