किसी पक्षी को मारने के कई तरीके हैं। अलग-अलग लोगों के पास चीजों को प्रभावी ढंग से करने के अपने अनूठे तरीके होते हैं, यही कारण है कि मैंने विषय में OPINIONATED जोड़ा, यह एक से अधिक तालिकाओं में एकाधिक रिकॉर्ड डालने और अन्य सेवाओं को प्रभावी ढंग से चलाने का मेरा तरीका है।
उदाहरण के लिए, मान लें कि आप एक ऐसी सेवा चलाना चाहते हैं जो पंजीकरण नियंत्रक में इन सूचीबद्ध कार्यों को करती है:
यहां मुख्य सार यह है कि हम एक नियंत्रक में कई सेवाएं चला रहे हैं और उन सभी को सफलतापूर्वक चलना चाहिए ताकि हमारे पास आंशिक लेनदेन समस्या न हो।
एक आंशिक लेनदेन को एक ऐसे परिदृश्य के रूप में वर्णित किया जा सकता है जहां लेनदेन के केवल कुछ हिस्से ही पूरे होते हैं, जिससे डेटा असंगति होती है।
हम यह कैसे सुनिश्चित करें कि हम इसके विरुद्ध मार्गदर्शन करें?
हम लारवेल ढांचे में हमारे लिए आसानी से उपलब्ध डेटाबेस लेनदेन पहलू का उपयोग करते हैं।
डेटाबेस लेनदेन चलाने के लिए, हमें कोड निष्पादक को यह बताना होगा कि यह एक डेटाबेस लेनदेन है।
DB::beginTransaction();
फिर हम एक 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");
यदि इस प्रयास ब्लॉक में सभी सेवाएँ सफल हैं, तो डेटाबेस कमिट इन लेनदेन को डेटाबेस में सहेज लेगा।
अब आइए कैच ब्लॉक भाग को देखें।
यदि कोई लेनदेन/सेवा TRY ब्लॉक में विफल हो जाती है, तो यह कैच ब्लॉक में आ जाएगी। इसलिए हम डेटाबेस में डाले गए प्रत्येक लेनदेन को रोलबैक करने के लिए DB पहलू को फिर से कॉल करेंगे:
DB::rollBack(); return errorResponseHelper('fail', "Operation not successful, please retry");
DB::rollBack() मुखौटा डेटाबेस में डाले गए प्रत्येक लेन-देन को मिलीसेकेंड में बिना किसी समस्या के अनसेव/रोलबैक कर देगा।
इस तरह मैं डेटा असंगति के खिलाफ मार्गदर्शन करता हूं, खासकर जब मैं लारवेल में एक से अधिक डेटाबेस लेनदेन चला रहा हूं।
पूर्ण कोड ब्लॉक:
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