Existem muitas maneiras de matar um pássaro. Diferentes pessoas têm suas maneiras únicas de fazer as coisas de forma eficaz, por isso adicionei OPINIONATED ao tópico, esta é a minha maneira de inserir múltiplos registros em mais de uma tabela e executar outros serviços de forma eficaz.
Por exemplo, digamos que você queira executar um serviço que executa estas tarefas sub-listadas em um controlador de registro:
A ideia principal aqui é que estamos executando vários serviços em um controlador e todos eles devem ser executados com êxito para que não tenhamos um problema de Transação parcial.
Uma Transação Parcial pode ser descrita como um cenário em que apenas algumas partes de uma transação são concluídas, levando a inconsistência de dados.
Como podemos ter certeza de que estamos orientando contra isso?
Usamos a fachada Database Transactions prontamente disponível para nós na estrutura Laravel.
Para executar uma transação de banco de dados, precisamos informar ao executor do código que esta é uma transação de banco de dados.
DB::beginTransaction();
Em seguida, criamos um bloco try-catch para que possamos detectar erros facilmente e fazer o que for necessário. O bloco try será inserido no banco de dados enquanto o bloco catch capturará quaisquer erros encontrados.
Para o conteúdo do bloco Try, teremos
$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]));
Então, a parte mais importante deste bloco TRY é confirmar essas alterações se todos os serviços forem executados com sucesso e retornarem uma resposta bem-sucedida.
DB::commit(); return successResponseHelper('success', "OTP has been sent to your mobile/email, kindly note that OTP validity is 10 minutes");
Se todos os serviços neste bloco try forem bem-sucedidos, o commit do banco de dados salvará essas transações no banco de dados.
Agora vamos dar uma olhada na parte do bloco Catch.
Se uma transação/serviço falhar no bloco TRY, ela irá para o bloco catch. Portanto, chamaremos a fachada DB novamente para reverter todas as transações que foram inseridas no banco de dados assim:
DB::rollBack(); return errorResponseHelper('fail', "Operation not successful, please retry");
A fachada DB::rollBack() cancelará o salvamento/reversão de todas as transações que foram inseridas no banco de dados sem problemas em milissegundos.
É assim que eu oriento contra inconsistência de dados, especialmente quando estou executando mais de uma transação de banco de dados no Laravel.
O bloco 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"); }
Se você tiver alguma dúvida, não hesite em respondê-la.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3