Есть много способов убить птицу. У разных людей есть свои уникальные способы эффективного ведения дел, поэтому я добавил OPINIONATED в эту тему. Это мой способ вставки несколько записей в несколько таблиц и эффективного запуска других сервисов.
Например, предположим, что вы хотите запустить службу, которая выполняет перечисленные ниже задачи в контроллере регистрации:
Основная суть здесь в том, что мы запускаем несколько сервисов на контроллере, и все они должны работать успешно, чтобы не возникло проблемы с частичной транзакцией.
Частичная транзакция может быть описана как сценарий, в котором завершаются только некоторые части транзакции, что приводит к несогласованности данных.
Как нам избежать этого?
Мы используем фасад Транзакции базы данных, доступный нам в среде Laravel.
Чтобы выполнить транзакцию базы данных, нам нужно сообщить исполнителю кода, что это транзакция базы данных.
DB::beginTransaction();
Затем мы создаем блок try-catch, чтобы мы могли легко обнаруживать ошибки и делать все необходимое. Блок try будет вставляться в базу данных, а блок catch будет обнаруживать любые возникающие ошибки.
Для содержимого блока Try у нас будет
$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]));
Затем самая важная часть этого блока TRY — зафиксировать эти изменения, если все службы работают успешно и возвращают успешный ответ.
DB::commit(); return successResponseHelper('success', "OTP has been sent to your mobile/email, kindly note that OTP validity is 10 minutes");
Если все службы в этом блоке попытки прошли успешно, фиксация базы данных сохранит эти транзакции в базе данных.
Теперь давайте посмотрим на часть блока Catch.
Если транзакция/сервис завершается неудачей в блоке TRY, она попадает в блок catch. Поэтому мы снова вызовем фасад DB для отката каждой транзакции, которая была вставлена в базу данных, следующим образом:
DB::rollBack(); return errorResponseHelper('fail', "Operation not successful, please retry");
Фасад DB::rollBack() без проблем за миллисекунды отменит/откатит каждую транзакцию, которая была вставлена в базу данных.
Вот как я борюсь с несогласованностью данных, особенно когда я выполняю более одной транзакции базы данных в Laravel.
Полный блок кода:
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"); }
Если у вас есть какие-либо вопросы, не стесняйтесь задавать их.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3