سلسلة محاضرات ASP (21) إنشاء نصوص المعاملات
الكاتب:Eve Cole
وقت التحديث:2009-05-30 19:58:32
غالبًا ما تتطلب تطبيقات الأعمال القدرة على تشغيل البرامج النصية والمكونات داخل المعاملات. المعاملة هي عملية خادم، حتى لو كانت العملية تتضمن العديد من الخطوات (على سبيل المثال، الطلب، والتحقق من المخزون، ودفع الفواتير، وما إلى ذلك)، فيمكنها فقط إرجاع النجاح الإجمالي للعملية أو فشلها. يمكن للمستخدمين إنشاء برامج نصية لـ ASP يتم تشغيلها داخل المعاملة. في حالة فشل أي جزء من البرنامج النصي، سيتم إنهاء المعاملة بأكملها.
تعتمد معالجة معاملات ASP على Microsoft Transaction Server (MTS). يعد Microsoft Transaction Server (MTS) نظامًا لمعالجة المعاملات لتطوير وتكوين وإدارة تطبيقات خادم الإنترنت والإنترانت عالية الأداء والقابلة للتطوير والقوية. يوفر Transaction Server نموذج تصميم تطبيق لتطوير التطبيقات الموزعة والقائمة على المكونات. كما يوفر أيضًا بيئة تشغيل لتكوين هذه التطبيقات وإدارتها.
القدرة على إنشاء البرامج النصية للمعاملات مضمنة في Internet Information Server وPersonal Web Server. إذا كان Microsoft Transaction Server مثبتًا لديك، فيمكنك حزم المكونات بحيث يتم تشغيلها داخل المعاملة.
حول المعاملات المعاملة هي النجاح الشامل أو الفشل للعملية. يتم استخدام معالجة المعاملات لتحديث قاعدة البيانات بشكل موثوق. عند إجراء العديد من التغييرات ذات الصلة على قاعدة بيانات أو تحديث قواعد بيانات متعددة في وقت واحد، تأكد من تنفيذ كافة التغييرات بشكل صحيح. إذا فشل أي من هذه التغييرات، فيجب استعادة الحالة الأصلية لجداول قاعدة البيانات.
بدون MTS، ستحتاج إلى كتابة البرامج النصية والمكونات لتتبع التغييرات المطلوبة يدويًا لاستعادة البيانات في حالة فشل بعض التغييرات. باستخدام MTS، يمكنك ببساطة إعلان البرامج النصية والمكونات الخاصة بك على أنها "تتطلب معاملات" والسماح لـ MTS بمعالجة تناسق المعاملات. تنطبق معالجة المعاملات فقط على الوصول إلى قاعدة البيانات؛ ولا يمكن لـ MTS استرداد التغييرات التي تم إجراؤها على نظام الملفات أو الموارد الأخرى غير المتعلقة بالمعاملات. يجب أن تكون قاعدة البيانات التي يصل إليها التطبيق مدعومة بواسطة MTS. حاليًا، يدعم MTS SQL Server وأي خادم يدعم بروتوكول XA (المحدد بواسطة اقتران X/Open). سيستمر MTS في توسيع الدعم لقواعد البيانات الأخرى.
لا يمكن أن تمتد المعاملات إلى صفحات ASP متعددة. إذا كانت المعاملة تتطلب كائنات من مكونات متعددة، فيجب دمج العمليات التي تستخدم هذه الكائنات في صفحة ASP. على سبيل المثال، افترض أن لديك مكونًا يقوم بتحديث قاعدة بيانات كشوف المرتبات ومكونًا يقوم بتحديث سجلات الموظفين في قاعدة بيانات الموارد البشرية. لتسجيل معلومات جديدة عن الراتب لأحد الموظفين، تحتاج إلى كتابة برنامج نصي يستدعي هذين المكونين في سياق المعاملة، أحدهما لتحديث قاعدة بيانات الرواتب والآخر لتحديث درجة الموظف في قاعدة بيانات الموارد البشرية.
الإعلان عن البرامج النصية للمعاملات عندما تعلن عن صفحة كصفحة للمعاملات، يتم تشغيل أي أوامر نصية وكائنات في الصفحة في نفس بيئة المعاملات. يعالج Transaction Server تفاصيل إنشاء المعاملات ويحدد ما إذا كانت المعاملة تنجح (ترتكب) أو تفشل (تنتهي). لإعلان صفحة ما على أنها معاملة، قم بإضافة توجيه @TRANSACTION في أعلى الصفحة:
<%@ المعاملة = القيمة %>
يمكن أن تكون معلمة القيمة واحدة مما يلي:
معنى القيمة
Requires_New يبدأ معاملة جديدة.
مطلوب لبدء معاملة جديدة.
المدعوم لا يبدأ المعاملة.
Not_Supported لا يبدأ المعاملة.
يجب أن يكون توجيه @TRANSACTION في السطر الأول من الصفحة، وإلا سيتم إنشاء خطأ. يجب إضافة هذا التوجيه إلى كل صفحة تحتاج إلى التشغيل ضمن المعاملة. عندما تنتهي معالجة البرنامج النصي، تنتهي المعاملة الحالية.
تتطلب معظم التطبيقات بيئة معاملات لعمليات معينة فقط. على سبيل المثال، قد يتطلب موقع شركة طيران فقط نصوصًا برمجية للمعاملات للتعامل مع ترتيبات التذاكر والجلوس، بينما يمكن تشغيل كافة النصوص البرمجية الأخرى بشكل آمن دون بيئة معاملات. نظرًا لأن المعاملات تحتاج فقط إلى استخدامها للصفحات التي تتطلب معالجة المعاملات، فلا تعلن عن أن ملف Global.asa الخاص بالتطبيق الخاص بك هو معاملات.
إذا تم إحباط معاملة، يقوم Transaction Server بإرجاع أية تغييرات على الموارد المدعومة بالمعاملة. في الوقت الحالي، تدعم خوادم قواعد البيانات فقط المعاملات بشكل كامل لأن البيانات الموجودة في قاعدة البيانات هي الأكثر أهمية لتطبيقات المؤسسة. لا يقوم Transaction Server باستعادة التغييرات التي تم إجراؤها على الملفات ومتغيرات الجلسة والتطبيق والمجموعات وما إلى ذلك الموجودة على القرص الثابت. ومع ذلك، يمكنك البرنامج النصي لاستعادة المتغيرات والمجموعات عن طريق كتابة أحداث المعاملة، كما هو موضح في الموضوع التالي. في أوقات معينة، يمكن أيضًا للبرنامج النصي الخاص بك تنفيذ معاملة أو إنهاؤها بشكل صريح، كما هو الحال عند فشل كتابة البيانات إلى ملف.
تنفيذ البرامج النصية أو إنهاؤها نظرًا لأن Transaction Server يتتبع معالجة المعاملات، فإنه يحدد ما إذا كانت المعاملة قد نجحت أم فشلت بالكامل. يمكن للبرنامج النصي إنهاء المعاملة بشكل صريح عن طريق استدعاء ObjectContext.SetAbort. على سبيل المثال، يحتاج البرنامج النصي إلى إنهاء معاملة عندما يتلقى رسالة خطأ من أحد المكونات، أو ينتهك مواصفات العمل (على سبيل المثال، رصيد الحساب أقل من 0)، أو يفشل في العمليات غير المتعلقة بالمعاملات مثل قراءة الملفات وكتابتها. إذا انتهت مهلة الصفحة قبل اكتمال المعاملة، فيجب أيضًا إنهاء المعاملة.
كتابة البرامج النصية لأحداث المعاملات وحدها لا تحدد ما إذا كانت المعاملة ستنجح أم ستفشل. ومع ذلك، يمكنك كتابة الأحداث التي يتم استدعاؤها عند تنفيذ المعاملة أو إنهائها. على سبيل المثال، إذا كان لديك برنامج نصي يؤكد الحساب البنكي، وتحتاج إلى إرجاع صفحات مختلفة للمستخدم لحالات مختلفة من المعاملة، فيمكنك استخدام الأحداث OnTransactionCommit وOnTransactionAbort لكتابة استجابات مختلفة للمستخدم.
<%@ المعاملة = مطلوب %>
<%
'إخراج المخزن المؤقت بحيث يمكن عرض صفحات مختلفة.
Response.Buffer = صحيح
%>
<أتش تي أم أل>
<الجسم>
<H1>مرحبًا بك في الخدمة المصرفية عبر الإنترنت</H1>
<%
تعيين BankAction = Server.CreateObject("MyExample.BankComponent")
BankAction.Deposit(Request("AcctNum"))
%>
<P>شكرًا لك، جارٍ معالجة معاملتك.</P>
</الجسم>
</HTML>
<%
' اعرض هذه الصفحة في حالة نجاح المعاملة.
SubOnTransactionCommit()
الاستجابة.اكتب "<HTML>"
الاستجابة.اكتب "<BODY>"
الرد. اكتب "شكرًا لك. لقد تم إضافة المبلغ إلى حسابك."
الاستجابة.اكتب "</BODY>"
الاستجابة.اكتب "</HTML>"
الاستجابة. فلوش ()
النهاية الفرعية
%>
<%
' اعرض هذه الصفحة في حالة فشل المعاملة.
SubOnTransactionAbort()
الاستجابة.مسح ()
الاستجابة.اكتب "<HTML>"
الاستجابة.اكتب "<BODY>"
Response.اكتب "نحن غير قادرين على إكمال معاملتك."
الاستجابة.اكتب "</BODY>"
الاستجابة.اكتب "</HTML>"
الاستجابة. فلوش ()
نهاية الفرعية
%>
تسجيل مكون في إدارة موارد MTS للمشاركة في معاملة، يجب تسجيل المكون في حزمة MTS ويجب تكوينه ليتطلب المعاملات. على سبيل المثال، إذا كان البرنامج النصي الخاص بك يتعامل مع الطلبات عن طريق استدعاء مكونين، يقوم أحدهما بتحديث قاعدة بيانات المخزون والآخر بتحديث قاعدة بيانات المدفوعات. ثم، يجب تشغيل هذين المكونين في نفس بيئة المعاملات. يضمن Transaction Server أنه في حالة فشل أي مكون، لن يتم تحديث أي قاعدة بيانات. لا تتطلب بعض المكونات معاملات، على سبيل المثال، مكون Ad Rotator.
تسجيل وتكوين مكونات المعاملات باستخدام MTS Resource Manager. يجب تعيين خصائص المعاملة على "يتطلب معاملة" أو "يتطلب معاملة جديدة". يجب تسجيل مكونات المعاملة في حزمة MTS. بدلاً من وضع المكونات في حزم IIS قيد التشغيل، قم بإنشاء الحزم الخاصة بك. عادةً، يجب وضع كافة المكونات في مكتبة المكونات. يمكن استخدام مكونات مكتبة المكونات بواسطة تطبيقات ASP متعددة وتشغيلها في عملية تطبيق ASP. استخدم MTS Explorer لإنشاء حزمة جديدة وتعيين خاصية تنشيط الحزمة إلى المكتبة.
يمكن أيضًا تسجيل مكونات المعاملات في حزمة الخادم. تعمل حزم الخادم عادةً كعملية منفصلة على الخادم. إذا كنت تريد استخدام فحص الأمان الوظيفي القائم على المجموعة أو إذا كنت تريد أن تكون المكونات الخاصة بك قابلة للوصول للتطبيقات الموجودة على أجهزة الكمبيوتر البعيدة، فاستخدم حزمة الخادم لمكونات المعاملات.
لاستخدام مستكشف MTS، يجب تثبيت Microsoft Transaction Server.
نطاق الكائن بشكل عام، لا تقم بتخزين الكائنات التي تم إنشاؤها من مكونات MTS في تطبيق ASP أو كائنات جلسة العمل. تختفي كائنات MTS بعد اكتمال المعاملة. نظرًا لأن كائن الجلسة وكائن التطبيق مصممان لمثيلات الكائنات المستخدمة بين صفحات ASP المختلفة، فلا تستخدمهما لتخزين الكائنات التي تم إصدارها في نهاية المعاملة.
البرنامج النصي ASP هو جذر المعاملة المعلنة، ونقطة البداية. أي كائن MTS تستخدمه صفحة ASP للمعاملات يعتبر جزءًا من المعاملة. عند اكتمال المعاملة، ستختفي كائنات MTS المستخدمة في الصفحة، بما في ذلك الكائنات المخزنة في كائن الجلسة أو التطبيق. بعد هذه النقطة، ستفشل أي محاولة لاستدعاء كائن على نطاق الجلسة أو على نطاق التطبيق من صفحة معاملات أخرى.
قائمة انتظار المعاملات يمكن أن تتسبب تحديثات قاعدة البيانات من خادم بعيد في تأخير المعاملات أو إنهائها بسبب تأخيرات الشبكة أو فشلها. نظرًا لأنه يجب الالتزام بجميع أجزاء المعاملة، فقد يتعطل التطبيق، في انتظار الالتزام أو رسالة الإجهاض من الخادم البعيد، أو قد يتم إحباط المعاملة بسبب تعذر إرسال تحديثات قاعدة البيانات.
بالنسبة للتحديثات التي يجب إكمالها في وقت واحد، فإن الأسلوب الصحيح هو إنهاء المعاملة أو تأخير إكمال المعاملة حتى يتمكن جميع المشاركين في المعاملة من الالتزام. على سبيل المثال، يجب أن تقوم عملية الحجز الخاصة بشركة الطيران بالخصم من الحساب البنكي للعميل وإيداع الحساب البنكي لشركة الطيران في نفس الوقت. إذا كان التحديث جزءًا من معاملة شاملة، ولكنه قد يكون متأخرًا عن التحديثات الأخرى، فقد لا ترغب في جعل العميل ينتظر حتى تكتمل عملية التحديث بأكملها. على سبيل المثال، قد تقوم معاملة حجز رحلة طيران أيضًا بإرسال طلب طعام إلى مورد طعام أو تحديث بدل سفر العميل. على الرغم من أنه يجب إكمال هذه العمليات، إلا أنه يمكن إجراؤها لاحقًا.
يمكّنك خادم انتظار الرسائل لـ Microsoft من تجميع تحديث أو مجموعة من التحديثات في رسالة معاملات إلى خادم بعيد. يضمن خادم قائمة انتظار الرسائل إرسال التحديثات إلى الخادم البعيد حتى لو كانت الشبكة غير متوفرة حاليًا. سيتلقى تطبيقك رسالة التزام ويمكنه متابعة معالجة المعاملة.