أنماط لتنفيذ المعاملات خارج قاعدة البيانات

StackOverflow https://stackoverflow.com/questions/580321

  •  06-09-2019
  •  | 
  •  

سؤال

يجب أن أرسل رسالة بريد إلكتروني، والكتابة إلى ملف، واستدعاء خدمة ويب. للحفاظ على الاتساق، يجب أن تحدث جميع الخطوات. إذا ترمي أي خطوة استثناء أو أخطاء خارج، يجب توالت جميع الخطوات.

قبل أن أذهب المتداول بمحرك حمض كائناتي، هل هناك أي أنماط مقبولة شائعة لتنفيذ دلالات الحمض على مستوى الكائن؟

الأفضل من ذلك، هل هناك أي مكتبات موجودة يمكنني استخدامها لمنصة .NET؟

يحرر: أعلم أن إرسال بريد إلكتروني لا يمكن التراجع عنه، لكن الفشل في الاتصال بخادم SMTP هو سبب لقتل المعاملة بالكامل. أيضا، أود أن يكون هذا قابل للتوسيع للاستخدام مع الإجراءات المستقبلية.

هل كانت مفيدة؟

المحلول

آخر مرة رأيت شيئا مثل هذا كان قبل عدة سنوات. الشيء القليل الذي أتذكره حول هذا الموضوع هو أنه يستخدم نمط الأمر وتخزين كل كائن أمر في قائمة الانتظار. أعتقد أنه كان مكدس ليفو.

لذلك إذا فشلت "المعاملة"، فإن المحرك سوف ينبثق كائن أمر، والتراجع عن الأمر، ثم قم بتدمير كائن الأمر. كرر حتى كومة كانت فارغة. تم مسح المكدس إذا كانت "المعاملة" ناجحة.

لسوء الحظ، لا أتذكر أكثر من ذلك.

csla.net. ينفذ كومة التراجع مماثلة. هذا هو المثال الوحيد مع التعليمات البرمجية التي يمكنني التفكير فيها من أعلى رأسي.

نصائح أخرى

ويندوز سير العمل مؤسسة لديها مفهوم تعويضات (باستخدام نشاط مركب) عندما قد لا تكون دلالات الحمض مناسبة .. بالطبع، لديها دعم لمعاملات الحمضية كذلك.

سؤال جيد هو السبب في أن تهتم بالتعويض؟ ليست معاملة حمض كبيرة واحدة مع التراجع التلقائي جيدة مثل جيدة؟ المعاملة الحمضية هي الأنسب عند حدوث العمليات داخل نفس قاعدة البيانات أو داخل نفس نظام المعلومات. من الأنسب أيضا عندما تنتهي العمليات بسرعة. عندما تشارك الشركات والخدمات المختلفة، فإن تحديد العملية من حيث دلالات الحمض غالبا ما تكون صعبة. لأنها ستكون معزولة ودائم، يجب عليك الحفاظ على جميع الموارد من الشركات المختلفة المغلقة لمدة المهمة. هذا غير معقول بشكل متكرر، خاصة إذا كانت المهمة طويلة. لأنها تكون متسقة وذرية، تحتاج إلى رمز تعويض مخصص.

أبسط تقنية دون الاعتماد بشكل كبير على مكتبة خارجية هي انتشار. وبعد دوريا نقطة تفتيش باستخدام التسلسل لأخذ لقطة من ولايتك، ثم الحفاظ على مجلة عن طريق تسلسل معلومات كافية على كل عملية فعالة جانبية مقابل بياناتك لتكرارها لاحقا. إذا ضرب شيء ما، فقم بإعادة تحميل نقطة التفتيش الأخيرة، ثم أعد تطبيق سجلات المجلة المكتوبة بعد هذه النقطة.

لشيء أكثر تطورا، حاول الذاكرة المعاملات البرمجيات. وبعد قد تكون الخرقاء إلى حد ما لتنفيذ اللغات الحالية، ولكنه قوي للغاية وقد يوفر لك بعض تقنيات التزامن الإضافية أيضا.

لعمليات لا رجعة فيها مثل الوصول إلى خدمة ويب أو إرسال بريد إلكتروني، ستحتاج إلى استخدامها تعويض المعاملات: قم بإجراء مكالمة خدمة ويب أخرى لإلغاء أو تحديث نتائج الوحدة السابقة، أو ربما إرسال بريد إلكتروني آخر، فيرجى تقديم المستلم الذي لم ينجح فيه الأمور على النحو المقصود.

نظرا لأنك لا تستطيع الأمم المتحدة إرسال بريد إلكتروني، فهي غير مكلفة نسبيا لكتابة ملف، سأفعل تلك الأشياء في الترتيب الصحيح:

  1. حاول كتابة الملف / كتابة الملف. إذا لم تكن مخطئ، توقف، باستمرار إلى:
  2. اتصل بخدمة الويب. إذا لم تنجح، احذف الملف والتوقف، واستمر مرة أخرى إلى:
  3. إرسال البريد الإلكتروني - البريد الإلكتروني غير متزامن على أي حال، لذلك لن تعرف حقا إذا تم إرساله أم لا لأن معظم خوادم البريد الإلكتروني محددة لإعادة المحاولة لبضعة أيام إذا حدث خطأ ولن تعود أبدا إلى الإدراك أن البريد الإلكتروني مرر حتى لو كان كنت ناجح.

فكرة واحدة هي استخدام JMS ك "المحرك" ويمكنك استخدام معاملات JMS (والتي يمكن أن تنضم إلى المعاملات الحالية مثل معاملة DB). يبدأ هذا في القيادة نحو هندسة ASYNC التي يحركها الحدث والتي ربما تكون شيئا جيدا إلا إذا كنا نتحدث عن تطبيقات بسيطة - في هذه الحالة ربما لا تحتاج إلى طرح السؤال.

مثال على ذلك سيكون إنشاء حساب بسيط. بالنسبة إلى هذا، فأنت تريد أن تستمر في معلومات الحساب على DB وأيضا أرسل المستخدم رسالة بريد إلكتروني للتنشيط - لكنك تريدها في نفس المعاملة لأسباب واضحة.

يجب ألا تضع رمز إرسال البريد الإلكتروني داخل المعاملة لأنه على الرغم من أنك قد ترسل البريد الإلكتروني - قد يفشل ارتكاب المعاملات DB لسبب أو آخر. يجب ألا تضع أيضا إرسال بريد إلكتروني خارج المعاملة (بعد الالتزام) لأن إرسال البريد الإلكتروني قد يفشل يؤدي إلى حساب الأيتام.

لذلك لاستخدام JMS في هذا السيناريو - ضع رمز إرسال JMS ضمن معاملة DB وانضم إلى هذه المعاملة. أنت مضمون تسليم الرسائل. على الطرف الآخر لديك شيء يستهلك قائمة الانتظار إرسال رسائل البريد الإلكتروني. في حالة إرسال إرسال البريد الإلكتروني، فإن الخيار الأفضل هو تسجيل / رفع تنبيه - ستعود JMS ووضع رسالة مرة أخرى في قائمة الانتظار للاستهلاك اللاحق. أي لمحاولة إعادة إرسال البريد الإلكتروني بمجرد إصلاح كل ما هي المشكلة.

الشيء الحرج هو - سجل DB متسق ويتم إرسال البريد الإلكتروني في نهاية المطاف.

أفكاران:

أيضا، مشروع تجريبي STM .NET. تم إصداره مؤخرا. تضيف هذه المشروعات ذاكرة المعاملات إلى C #. في الواقع يعدل CLR لدعم هذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top