database - عزل مستوى مقابل متفائل قفل الإسبات، جبا




hibernate jpa (2)

اعتمادا على مستوى العزلة التي اخترتها، سوف يكون مؤمنا مورد معين حتى تعطى المعاملة يرتكب أو التراجع - يمكن أن يكون قفل على جدول كامل، صف أو كتلة من سكل. انها تأمين متشائم وانها مضمونة على مستوى قاعدة البيانات عند تشغيل الصفقة.

ويفترض تأمين متفائل من ناحية أخرى أن المعاملات متعددة نادرا ما تتداخل مع بعضها البعض لذلك لا حاجة الأقفال في هذا النهج. هو الاختيار من جانب التطبيق الذي يستخدم السمة @Version أجل تحديد ما إذا كان قد تم تغيير إصدار سجل بين جلب ومحاولة تحديثه.

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

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

نأمل أن يوضح بعض الأشياء بالنسبة لك.

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

أرى أن مستويات العزل ضمان الاتساق القراءة وقفل متفائل مع حقل @Version يمكن ضمان كتابة البيانات مع حالة متسقة.

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


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

في رأيي أن إدراج مستوى العزلة القابلة للتسلسل، أو قفل تشاؤمي بعبارة أخرى، ينبغي أن يكون جيدا جدا على الرغم من القرار والتطبيق ل:

  • قواعد البيانات الكبيرة والمعاملات القصيرة التي تحدث سوى عدد قليل من الصفوف
  • حيث فرصة أن اثنين من المعاملات المتزامنة سوف تعديل نفس الصفوف منخفضة نسبيا.
  • حيث المعاملات طويلة نسبيا نسبيا هي القراءة فقط في المقام الأول.

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

لذلك عندما نأخذ التشاؤم - متفائل تأمين استراتيجيات الطيف، في رأيي الحقيقة تكمن في مكان أكثر نحو تأمين متفائل مع نكهة من تسلسل هنا وهناك.

أنا حقا لا يمكن الإشارة إلى أي شيء هنا كما هو الجواب على أساس تجربتي الشخصية مع العديد من المشاريع المعقدة على شبكة الإنترنت ومن ملاحظاتي عندما كنت بريابرينغ إلى شهادة جبا بلدي.

امل ان يساعد.





orm