sql بالعربي - المناقلات المتزامنة و درجات العزل :

الكاتب بتاريخ عدد التعليقات : 0

sql بالعربي - المناقلات المتزامنة  و درجات العزل :


sql بالعربي
نواصل مشوارنا في شرح SQL بالعربي ونحدث اليوم عن المناقلات المتزامنة يمكنك قراءة الدرس السابق .من هذا الرابط قم بالضغط علية للانتقال للدرس .يتبع شرح Transactions

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

يحدد المعيار SQL99 اربع مستويات عزل نذكرها من افضلها للأداء الى افضلها بالنسبة للحماية :

  • READ UNCOMMITED
  • READ COMMITED
  • REPEATABLE READ
  • SERIALIZABLE


كما تصنف المناقلات الى نوعين للقراءة فقط وللقراءة والكتابة .
تكون الصيغة التي يحددها المعيار لتحديد نوع المناقلة على الشكل التالي :

SET [LOCAL] TRANSACTION (( READ ONLY | READ WRITE )
ISOLATION LEVEL
( READ COMMITED | READ UNCOMMITED | REPEATABLE READ | SERIALIZABLE )
| DIAGNOSTIC SIZE INT );

فللاختيار بين التصنيفين الاساسيين لمناقلة نستخدم :

SET TRANSACTION [ READ ONLY | READ WRITE ];

ولتحديد درجة العزل نستخدم التعبير :
SET TRANSACTION ISOLATION LEVEL isolation_level_name;

انتبة :

درجة العزل التلقائية في Oracle و MySQL و DB2 و SQL Server هي READ COMMITED .

درجات العزل :

ذكرنا اعلاه انواع درجات العزل التي حددها المعيار SQL99 سنأخذها بالتفصيل .

اولا درجة العزل READ UNCOMMITED :

هي اسرع واكثر درجات العزل خطورة تستخدم الصيغة :
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITED;
عندما تكون المناقلة من هذا النوع لا تكون خاصية العزل المميزة للمناقلات مطبقة وتستطيع المناقلات قراءة التعديلات التي لم يتم اتمامها .
وتظهر مشاكل القراءات الخاطئة حيث قد تقرأ مناقلة مجموعة من البيانات تم تعديلها من قبل مناقلة اخرى غير متممة بـCOMMIT عندها تكون البيانات التي قامت المناقلة الاولى بقراءتها خاطئة .

هنا يمكن طرح التساؤل التالي :

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

ثانياً درجة العزل READ COMMITED:

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

SET TRANSACTION ISOLATION LEVEL READ COMMITED;

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

إذا كان هذا الأمر مقبولاً بالنسبة لك او إذا امكنك إيجاد حل لتفادي هذا السيناريو كأن تخزن القيمة التي تحصل عليها في المرة الاولى في متغير مؤقت لتفادي قراءتها في نفس المناقلة مجدداً عندئذ يمكنك الاستمرار باستخدام درجة العزل READ COMMITED وإلا ستكون مضطراً إلى الانتقال إلى درجة العزل السوية REPEATABLE READ .

ثالثاً درجة العزل REPEATABLE READ :

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

نستخدم لتفعيل درجة العزل هذه الصيغة:
SET TRANSACTION ISOLATION LEVEL REPATABLE READ;

نتساءل هنا هل غطينا كل الثغرات ؟ الاجابة هي لا .

مانزال معرضين لمشكلة تسمى بمشكلة الأشباح, قد يبدو اسم هذه المشكلة غريباَ لذلك لفهم التفاصيل لنتخيل السيناريو التالي:
لدينا مناقلة اولى قامت احد عملياتها بقراءة جميع السجلات التي تحقق شرط where محدد.

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

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

باختصار تعتبر مشكلة مكافئة لمشكلة القراءة المتكررة ولكن بفرق ان المشكلة هنا في السجلات الجديدة التي تم إدراجها.

رابعاً درجة العزل SERIALIZABLE :

نستطيع في درجة العزل هذه ضمان عدم قدرة أي مناقلة من اضافة او تعديل او حذف أي سجل لاي بيانات تدخل في شرط where لعملية في مناقلة اخرى .

سنعاني بالطبع المزيد من الوقت الضائع وانخفاض الاداء .

الصيغة المستخدمة لتفعيل درجة العزل هذه هي :

SET TRANSACTION ISOLATION LEVEL SERIALISABLE;

اكتفي بهذا القدر وفي الدرس القادم نواصل بقية الحديث حول موضوع درجات العزل ,,,نلتقي في درس sql بالعربي اخر ,,, اذا لم تكن مشترك في المدونة اشترك الان او قم بمتابعتنا على جوجل بلس او سجل اعجابك بصفحتنا على الفيس بوك لتصلك كل منشور نقوم بنشرة ,,, كما يمكنك تحميل تطبيقنا من جوجل بلاي وتابع احدث اخبار التقنية المضافة في التطبيق اولا بأول ..
عنوان الدرس القادم درجات العزل في قواعد البيانات المختلفة.
دمت بخير 

0 تعليق على موضوع "sql بالعربي - المناقلات المتزامنة و درجات العزل :"

لا تبخل علينا باقتراحك او قم بمشاركة الموضوع ليستفيد الاخرين ايضاً شكرا لزيارتك عزيزي الزائر
الإبتساماتإخفاء