Hay muchas formas de matar un pájaro. Diferentes personas tienen sus formas únicas de hacer las cosas de manera efectiva, por eso agregué OPINIONADO al tema, esta es mi forma de insertar múltiples registros en más de una tabla y ejecutar otros servicios de manera efectiva.
Por ejemplo, digamos que desea ejecutar un servicio que realiza estas tareas enumeradas a continuación en un controlador de registro:
La esencia principal aquí es que estamos ejecutando múltiples servicios en un controlador y todos deben ejecutarse correctamente para que no tengamos un problema de transacción parcial.
Una Transacción parcial puede describirse como un escenario en el que solo se completan algunas partes de una transacción, lo que genera inconsistencia de datos.
¿Cómo nos aseguramos de orientarnos contra esto?
Utilizamos la fachada Transacciones de base de datos que tenemos disponible en el marco de Laravel.
Para ejecutar una transacción de base de datos, debemos informarle al ejecutor del código que se trata de una transacción de base de datos.
DB::beginTransaction();
Luego creamos un bloque try-catch para que podamos detectar errores fácilmente y hacer lo necesario. El bloque try se insertará en la base de datos mientras que el bloque catch detectará cualquier error encontrado.
Para los contenidos del bloque Probar, tendremos
$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]));
Entonces, la parte más importante de este bloque TRY es confirmar estos cambios si todos los servicios se ejecutan correctamente y devuelven una respuesta exitosa.
DB::commit(); return successResponseHelper('success', "OTP has been sent to your mobile/email, kindly note that OTP validity is 10 minutes");
Si todos los servicios en este bloque de prueba tienen éxito, la confirmación de la base de datos guardará estas transacciones en la base de datos.
Ahora veamos la parte del bloque Catch.
Si una transacción/servicio falla en el bloque TRY, llegará al bloque catch. Entonces llamaremos a la fachada DB nuevamente para revertir cada transacción que se haya insertado en la base de datos de la siguiente manera:
DB::rollBack(); return errorResponseHelper('fail', "Operation not successful, please retry");
La fachada DB::rollBack() desguardará/revertirá cada transacción que se haya insertado en la base de datos sin problemas en milisegundos.
Así es como me guío contra la inconsistencia de datos, especialmente cuando estoy ejecutando más de una transacción de base de datos en Laravel.
El bloque de código completo:
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"); }
Si tienes alguna pregunta, no dudes en dejarla.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3