السلام عليكم
مقدمة
بالنظر الى ان فئة البيانات تستخدم منفصلة عن قاعدة البيانات ، لذا يجب الرقابة على تحقق التزامن بين سجلات قاعدة البيانات وبين سجلات فئة البيانات. على سبيل المثال، قد نجد ان السجلات فى قاعدة البيانات قد تغيرت منذ اخر تأهيل لفئة البيانات. فى هذه الحالة يجب كتابة الكود المناسب لتحديد مايجب عمله بالنسبة لسجل قاعدة البيانات او السجل المقابل فى فئة البيانات.
انواع التحكم فى التزامن
هناك ثلاث اساليب شائعة لادارة التزامن فى قاعدة البيانات:
• اسلوب Pessimistic Concurrency Control. بموجب هذا الاسلوب لا يكون الصف متاحا لباقى المستخدمين بعد استخراجه من قاعدة البيانات الى ان يتم تحديثه فيها بواسطة نفس المستخدم.
• اسلوب Optimistic Concurrency Control. لا يكون الصف متاحا لباقى المستخدمين اثناء عملية التحديث فقط. ويتم فحص الصف فى قاعدة البيانات لتقرير ما اذا كان الصف قد تم تعديله. ولايسمح بتحديث الصف الذى تم تعديله بواسطة المستخدمين الاخرين
• اسلوب Last in Wins . بموجب هذا الاسلوب لا يكون الصف متاحا امام باقى المستخدمين اثناء عملية التحديث فقط. كما لا يتم التحقق من تحديث الصف بواسطة المستخدمين الاخرين. ويتم كتابة اخر تحديث بالصف مما يترتب عليه المتابعة على التحديث السابق.
يستخدم كل من ADO.NET و VS.NET اسلوب Optimistic Concurrency بسبب استخدام هياكل البيانات غير المتصله المتمثلة فى فئات البيانات. ولتنفيذ هذا الاسلوب، يمكن استخدام احد مدخلين: مدخل رقم الاصدار(The Version Approach) ومدخل حفظ جميع القيم (The Saving All Values Approach).
مدخل رقم الاصدار لتحقيق التزامن(The Version Approach):
فى هذا المدخل يجب ان يكون بالسجل المطلوب تحديثه عمود يحتوى على رقم الاصدار(Version Number) او بصمة التاريخ والوقت(Date-time Stamp) ولتحقيق التزامن باستخدام بصمة الوقت ، نقوم بالتحديث فقط عند تطابق القيمة التى من هذا النوع فى السجل المطلوب تحديثه والقيمة الموجودة فى فقرة WHERE بعبارةSQL UPDATE كما يتضح من الكود التالى:
UPDATE Table1 SET Column1=@newvalue1, Column2= @newvalue2 WHERE DateTimeStamp=@origDateTimeStamp
ويمكن استخدام رقم الاصدار بدلا من بصمة الوقت، كما يتضح من الكود التالى:
UPDATE Table1 SET Column1=@newvalue1, Column2= @newvalue2 WHERE RowVersion=@origRowVersionValue
مدخل حفظ جميع القيم لتحقيق التزامن(The Saving All Values Approach):
فى هذا المدخل يتم الحصول على نسخ من جميع الحقول عند قراءة السجل. وهو ما يحدث فى كائن DataSet حيث يتم الاحتفاظ بالنسخة الاصلية من البيانات والنسخة المعدلة. وعند القيام بتحديث مصدر البيانات بالتغييرات الحادثة فى فئة البيانات، يتم مقارنة القيم الاصلية فى صف فئة البيانات مع السجل الاصلى فى مصدر البيانات. عند تطابق السجلين، تتم عملية التحديث بنجاح. المثال التالى يوضح نص تحديث جدول العملاء فى قاعدة البيانات باستخدام البيانات المقابلة فى فئة البياانات:
UPDATE Customers SET CustomerID=@currCustomerID, CompanyName= @currCompanyName, ContactName=@currContactName, ContactTitle= @currContactTitle, Address=@currAddress,City=@currCity,PostalCode= @currPostalCode,Phone=@currPhone,Fax=@currFax WHRER(CustomerID=@origCustomerID) AND (Address=@origAddress OR @origAdress IS NULL AND Adress IS NULL) AND (City=@origCity OR @origCity IS NULL AND City IS NULL) AND (CompanyName=@origCompanyName OR @origCompanyName IS NULL AND CompanyName IS NULL) AND (ContactName=@origContactName OR @origContactName IS NULL AND ContactName IS NULL) AND (ContactTitle= @origContactTitle OR @origContactTitle IS NULL AND ContactTitle IS NULL) AND (Fax=@origFax OR @origFax IS NULL AND Fax IS NULL) AND (Phone=@origPhone OR @origPhone IS NULL AND Phone IS NULL) AND (PostalCode=@origPostalCode OR @origPostalCode IS NULL AND PostalCode IS NULL); SELECT CustomerID,CompanyName,ContactTitle,Address,City,PostalCode,Phone,Fax FROM Customer WHERE (CustomerID=@currCustomerID)
يجب ملاحظة ان الممررات PARAMETERS التسعة لعبارة SET تمثل القيم الحالية التى سوف تكتب فى قاعدة البيانات، بينما تمثل الممررات التسعة فى فقرة WHRER القيم الاصلية النى تستخدم فى تحديد السجل الاصلى. وتستخدم عبارة SELECT المذكورة فى اخر النص لتجديد فئة البيانات بعد الانتهاء من عملية التحديث فى قاعدة البيانات.
التعامل مع اخطاء التزامن
تقدم ADO.NET كائن DBConcurrency Execption للمساعدة فى حل المشاكل الناشئة عن مخالفات التزامنويعيد هذا الكائن صف البيانات الذى تسبب فى حدوث خطأ التزامن، كما يعيد ايضا الرسالة المرتبطة بهذا الخظأ



