من مشروعي التخرج – 2 – إدارة تزامن المعطيات في مشاريع الويب
سأقوم في هذه السلسلة من المقالات بوضع بعض الفقرات العامة التي وردت في أطروحة مشروع التخرج الذي تقدمنا به في كلية الهندسة المعلوماتية، وقد حاز هذا المشروع على العلامة الاعلى على مستوى الكلية في تلك السنة، قدم هذا المشروع كل من:
م.محمود البيك
م.طلال عبد الواحد
م. غيث عقاد
م. محمد صخر صوان
أشرف على المشروع:
الدكتور : أحمد بدرالدين خضر
الدكتور : حيــــــان حــــــصرم (رحمه الله و اسكنه جنانه)
المهندس : بشــــر مسلاتـــــي
إدارة تزامن المعطيات Concurrency:
إن التطبيقات الموزعة تحتاج لإدارة عمليات التعديل المتزامنة. حيث يمكن أن يحدث السيناريو التالي:
- قام المستخدم A بفتح صفحة التعديل لأحد عناصر النظام وليكن منتج ما وفي هذه الأثناء قام المستخدم B بفتح صفحة التعديل وقام بتعديل بعض البيانات وحفظ هذه التعديلات (خلال هذه الفترة يقوم المستخدم A ببعض التعديلات ولكن لم يحفظها) وبعد أن أجرى المستخدم A تعديلاته ضغط على زر الحفظ. في هذه الحالة تعديلات المستخدم A جرت على بيانات خاطئة لأنه أثناء التعديل للبيانات لم يعلم بالتعديلات التي حفظها المستخدم B.
مخطط ال Sequence Diagram التالي يوضح السيناريو:
هذه المشكلة شائعة في التطبيقات الموزعة ولها عدة حلول
- الحل الافتراضي “Last One Wins”
وهو يمثل تجاهل هذه المشكلة وبكل بساطة حفظ تعديلات آخر مستخدم قام بالتعديل دون فحص فيما إذا كان أحدهم قام بالتعديل أي حفظ تعديلات المستخدم A لأنه آخر من قام بالتعديل وهو حل ممكن في التطبيقات ذات الأهمية المنخفضة حيث أنه الابسط والحلول الأخرى مكلفة برمجيا.
ولكنه غير مناسب أبدا للمشاريع المؤسساتية الكبيرة ولذلك لم نختره في مشروعنا.
- الحل التزامني المتشائم (بالقفل) Pessimistic Concurrency:
حيث يتم ” قفل “السجل الذي يجري تعديله حاليا ومنع أي مستخدم من تعديله
ففي السيناريو السابق لن يسمح للمستخدم B بالدخول إلى صفحة تعديل هذا العنصر لأن A لا سيزال في صفحة التعديل ويتم فك القفل في الحالتين التاليتين:
- عند الخروج من صفحة التعديل دون الحفظ.
- عند حفظ التعديلات.
وهذا الحل جيد فقط في التطبيقات المكتبية وذلك لإمكانية معرفة وقت الخروج من صفحة التعديل وتطبيقه غير ممكن في الويب، ونحن في مشروعنا نريد حلا يشمل جميع أنواع التطبيقات وليس المكتبي منها فقط ولذلك لم نطبق هذا الحل أيضا.
- الحل التزامني المتفائل Optimistic Concurrency وهو المعتمد في المشروع:
عند فتح صفحة التعديل من قبل المستخدم A لن يتم قفل السجل ويمكن لأي مستخدم فتح صفحة التعديل ولكن عند حدوث السيناريو السابق يتم إعطاء رسالة خطأ للمستخدم A ويتم تجاهل تعديلاته لأنه قام بالتعديل انطلاقا من بيانات أصبحت خاطئة بعد التعديل الذي قام به B أثناء هذه العملية.
وهو الحل المعتمد في مشروعنا لأنه مناسب لكافة أنواع التطبيقات المكتبية منها وتطبيقات الويب وأي نوع آخر مع العلم أنه الحل الأصعب تنفيذا من الناحية البرمجية.
- طريقة بسيطة لتنفيذ هذا الحل في مشروع ويب:
- يتم إضافة حقل إلى جميع الجداول في النظام وهذا الحقل عبارة عن (Time Stamp) تتغير عند أي تعديل على السجل.
وعند طلب عملية التعديل يتم فحص القيمة الموجودة في الجدول مع القيمة المرسلة من أجل التعديل فإن كانتا متساويتين يتم التعديل بنجاح لأن هذا يدل على أن السجل لم يتم تعديله منذ أن أُحضر السجل من قاعدة البيانات في المرة السابقة.
وأما إذا كانت قيم الـ Time Stamp غير متساوية فيتم توليد خطأ يفيد بأن عملية التعديل فشلت بسبب فحص التزامن المتفائل، و سيتم اعلام المستخدم بان العملية فشلت بهذا السبب.







