تحديثات LINQ إلى XML - كيف يتعامل مع العديد من القراء/الكتاب المتزامنين؟

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

سؤال

لدي نظام قديم يستخدم XML لتخزين البيانات الخاصة به.سأستخدم البيانات لمشروع صغير آخر وأردت استخدام LINQ إلى XML للاستعلام/تحديث البيانات؛ولكن هناك سيناريوهان لست متأكدًا مما إذا كنت بحاجة إلى التعامل مع نفسي أم لا:

1- إذا كان لدي شيء مشابه للكود التالي، وقام شخصان بالضغط على Save() في نفس الوقت؟هل ينتظر LINQ إلى XML حتى يصبح الملف متاحًا مرة أخرى قبل الحفظ، أم أنه سيتم طرحه فقط؟لا أريد أن أضع الأقفال إلا إذا كنت بحاجة لذلك :)

// I assume the next line doesn't lock the file
XElement doc = XElement.Load("Books.xml");
XElement newBook = new XElement("Book",
new XAttribute("publisher", "My Publisher"),
new XElement("author", "Me")));
doc.Add(newBook);

// What happens if two people try this at the same time?
doc.Save("Books.xml");

2- إذا قمت بتحميل () مستند، أضف إدخالاً ضمن عقدة معينة، ثم اضغط على Save ()؛ماذا يحدث إذا قام مستخدم آخر بالفعل بإضافة قيمة ضمن تلك العقدة (منذ أن قمت بالضغط على Load()) أو الأسوأ من ذلك، حذف العقدة؟

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

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

المحلول

إنها ليست في الحقيقة مشكلة LINQ إلى XML، ولكنها مشكلة أساسية في التزامن.

  1. بافتراض أن الشخصين يقومان بالضغط على "حفظ" في نفس الوقت، وأن مخزن النسخ الاحتياطي عبارة عن ملف، فاعتمادًا على كيفية فتح الملف للحفظ، قد تحصل على خطأ.إذا تركته لفئة XDocument (بمجرد تمرير اسم الملف)، فمن المحتمل أنه يفتحه حصريًا، وسيحصل شخص آخر يحاول القيام بنفس الشيء (على افتراض أن نفس الكود الذي يصل إليه) سيحصل على استثناء.يتعين عليك بشكل أساسي مزامنة الوصول إلى أي مورد مشترك تقرأ منه/تكتب إليه.

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

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