سؤال

لدي خدمة WCF التي تحتوي على طريقتين مكشوفان:

ملاحظة: يتم نشر خدمة WCF وخادم SQL في نفس الجهاز. يحتوي SQL Server على جدول واحد يسمى الموظف الذي يحافظ على معلومات الموظف.

  1. قراءة () هذه الطريقة تسترجع جميع الموظفين من SQL Server.
  2. اكتب () هذه الطريقة تكتب (إضافة وتحديث وحذف) موظف الموظفين في جدول الموظف إلى خادم SQL.

لقد قمت الآن بتطوير تطبيق قائم على سطح المكتب الذي يمكن من خلاله استعلام أي عميل، إضافة وتحديث وحذف معلومات الموظف عن طريق استهلاك خدمة ويب.

سؤال:

كيف يمكنني التعامل مع السيناريو، إذا أراد العملاء المهمليون تحديث معلومات الموظف في نفس الوقت؟ هل يقوم SQL Server نفسه باستخدام هذا باستخدام أقفال قاعدة البيانات؟

يرجى اقتراح لي أفضل نهج!

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

المحلول

بشكل عام، في بيئة غير متصلة التزامن متفائل مع rowversion/timestamp هو النهج المفضل. WCF. يفعل دعم المعاملات الموزعة، ولكن هذه طريقة رائعة لإدخال حظر طويل في النظام. معظم أدوات أورم سوف تدعم rowversion/timestamp خارج الصندوق.

بالطبع، في الخادم قد ترغب في استخدام المعاملات (إما على اتصال أو TransactionScope) تقديم أساليب مستودع الفردية "حمض"، لكنني سأحاول تجنب المعاملات على السلك قدر الإمكان.


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

لكن؛ القضية الثانية هي التزامن: إذا حصلت على 100 تحديث لنفس السجل، كيف تعرف ما هي الثقة؟ معظم الأنظمة سوف تدع أول قم بالتحديث، وتجاهل الباقي أثناء تشغيله في الافتراضات التي لا معنى لها حول البيانات. هذا هو المكان الذي يأتي فيه الطابع الزمني / rowversion. عن طريق إنفاذ "الطابع الزمني / الرودرة يجب أن يتطابق" في عبارة التحديث، يمكنك التأكد من أن الأشخاص يمكنهم تحديث البيانات التي لم تتغير منذ أخذ لقطة لها. لهذا الغرض، من الشائع الحفاظ على roadversion إلى جانب أي مثير للاهتمام البيانات التي تقوم بتحديثها.

نصائح أخرى

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

التحيات، ستيف.

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