1. المبادئ الأساسية للمعاملات
جوهر معاملات الربيع هو في الواقع دعم قاعدة البيانات للمعاملات. بدون دعم معاملات قاعدة البيانات ، لا يمكن لـ Spring توفير وظائف المعاملة. لقواعد بيانات تشغيل JDBC النقية ، إذا كنت ترغب في استخدام المعاملات ، يمكنك اتباع الخطوات التالية:
1. احصل على اتصال Connection Con = drivermanager.getConnection ()
2. افتح المعاملة con.setautocommit (صواب/خطأ) ؛
3. تنفيذ Crud
4.
5. أغلق الاتصال conn.close () ؛
بعد استخدام وظيفة إدارة معاملات Spring ، لم يعد بإمكاننا كتابة الكود في الخطوتين 2 و 4 ، ولكن سيتم القيام به تلقائيًا بواسطة SPIRNG. فكيف يفتح الربيع معاملات وإغلاق المعاملات قبل وبعد crud نكتب؟ من خلال حل هذه المشكلة ، يمكننا أن نفهم مبدأ التنفيذ لإدارة معاملات الربيع من الكل. اسمحوا لي أن أقدم بإيجاز طريقة التعليقات التوضيحية كمثال
1. قم بتشغيل برنامج تشغيل التعليقات التوضيحية في ملف التكوين وتحديده عن طريق التعليق على transactional على الفئات والأساليب ذات الصلة.
2. عندما يبدأ الربيع ، سوف يحلل ويولد الفاصوليا ذات الصلة. في هذا الوقت ، سوف يتحقق من الفئات والأساليب مع التعليقات التوضيحية ذات الصلة ، وإنشاء وكيل لهذه الفئات والأساليب ، ويؤدي حقن التكوين ذات الصلة بناءً على المعلمات ذات الصلة لـ transaction ، بحيث تتم معالجة المعاملات ذات الصلة لنا في الوكيل (ابدأ المعاملات العادية ومعاملات ترحيل الاستثناء).
3. يتم تنفيذ الالتزام بالمعاملات وتراجع طبقة قاعدة البيانات الحقيقية من خلال Binlog أو Redo Log.
2. خصائص انتشار معاملات الربيع
تحدد سمة الانتشار المزعومة لمعاملات الربيع كيف يجب أن يتعامل الربيع مع سلوك المعاملات المتعددة عند وجودها في نفس الوقت. يتم تعريف هذه الخصائص في المعاملة. يتم شرح الثوابت المحددة في الجدول التالي:
ثالثا. مستوى عزل قاعدة البيانات
القراءة القذرة: تضيف إحدى المعاملات ، وحذف البيانات وتعديلها ، ولكنها غير ملتزمة ، ويمكن أن تقرأ معاملة أخرى بيانات غير ملتزم بها. إذا كانت المعاملة الأولى تراجع في هذا الوقت ، فإن المعاملة الثانية تقرأ البيانات القذرة.
لا توجد قراءة متكررة: تحدث عمليتان للقراءة في معاملة واحدة. بين عملية القراءة الأولى والعملية الثانية ، تقوم المعاملة الأخرى بتعديل البيانات. في هذا الوقت ، فإن البيانات القراءة مرتين غير متسقة.
قراءة الخيال: المعاملة الأولى تعدل البيانات في نطاق معين على دفعات ، وتضيف المعاملة الثانية بيانات واحدة إلى هذا النطاق. في هذا الوقت ، ستفقد المعاملة الأولى تعديل البيانات المضافة حديثًا.
تلخيص :
كلما ارتفع مستوى العزلة ، كلما زاد من ضمان سلامة البيانات واتساقها ، ولكن كلما زاد التأثير على أداء التزامن.
تتم قراءة مستوى العزل الافتراضي لمعظم قواعد البيانات ، مثل SQLServer و Oracle
مستوى العزل الافتراضي لعدد قليل من قواعد البيانات هو: قراءة متكررة على سبيل المثال: MySQL innodb
رابعا. مستوى العزلة في الربيع
خامسا تعشش المعاملات
من خلال المعرفة النظرية المذكورة أعلاه ، نفهم تقريبًا بعض السمات وخصائص معاملات قاعدة البيانات ومعاملات الربيع. بعد ذلك ، نقوم بتحليل بعض سيناريوهات المعاملات المتداخلة لفهم آلية انتشار معاملات الربيع بعمق.
افترض أن الطريقة A () لخدمة المعاملات الخارجية أ تدعو الطريقة ب () للخدمة الداخلية ب
prockation_required (الافتراضي الربيع)
إذا تم تعريف مستوى المعاملة من الخدمة. في هذا الوقت ، يسمى ServiceB.Methodb (). ServiceB.Methodb () يرى أنه يعمل داخل معاملة servicea.methoda () ، ولم يتم تشغيل معاملة جديدة.
إذا كانت ServiceB.Methodb () تعمل ، فسيقوم بتعيين معاملة لنفسها.
وبهذه الطريقة ، في حالة حدوث استثناء في servicea.methoda () أو في أي مكان داخل serviceb.methodb () ، سيتم التراجع عن المعاملة.
spection_requires_new
على سبيل المثال ، قمنا بتصميم هذا servicea.methoda () يحتوي على مستوى معاملة من الانتشار _required ، و serviceb.methodb () لديه مستوى معاملة من الانتشار _requires_new.
ثم عند تنفيذ serviceb.methodb () ، سيتم تعليق المعاملة التي يتم فيها تعليق servicea.methoda () ، وسيبدأ serviceb.methodb () معاملة جديدة وستستمر في التنفيذ بعد اكتمال المعاملة serviceb.methodb ().
الفرق بين معاملاته و serpation_required هو درجة التراجع عن المعاملة. لأن ServiceB.Methodb () هي معاملة جديدة ، فهناك معاملتان مختلفتان. إذا تم تقديم ServiceB.Methodb () ، فإن Servicea.Methoda () فشل في التراجع ، لن يتم التراجع عن ServiceB.Methodb (). إذا فشل ServiceB.Methodb () في التراجع ، إذا تم القبض على الاستثناء الذي تم إلقاؤه بواسطة servicea.methoda () ، فقد لا يزال يتم تقديم معاملة servicea.methoda () (يعتمد بشكل رئيسي على ما إذا كان الاستثناء الذي ألقاه B هو استثناء من الإرادة).
spercation_supports
على افتراض أن مستوى المعاملة من الخدمة. إذا تبين أن servicea.methoda () لم تبدأ الصفقة ، فلن تبدأ المعاملة نفسها. في هذا الوقت ، تعتمد معاملات الطريقة الداخلية بالكامل على المعاملة الخارجية.
الانتشار
أصبح الوضع أكثر تعقيدًا الآن. تم تكوين خاصية المعاملة الخاصة بـ ServiceB.Methodb () على أنها spection_nested. كيف سيتعاون الاثنان في هذا الوقت؟ method Serviceb#إذا كانت التراجع ، فإن المعاملات الداخلية (أي ServiceB#methodb) ستتراجع إلى SavePoint قبل تنفيذها ، في حين أن المعاملات الخارجية (أي Servicea#methoda) يمكن أن يكون لها طريقتان التاليتين للتعامل:
أ. استثناء الاستثناءات وتنفيذ منطق فرع الاستثناء
void methoda () {try {serviceb.methodb () ؛ } catch (someException) {// تنفيذ أعمال أخرى ، مثل servicec.methodc () ؛ }} هذه الطريقة هي أيضًا الشيء الأكثر قيمة في المعاملات المتداخلة. يلعب دور تنفيذ الفرع. إذا فشل ServiceB.Methodb ، فسيتم تنفيذ ServiceC.Methodc () ، وخدمة ServiceB.methodb قد عاد إلى نقطة التوفير قبل تنفيذها ، لذلك لا يتم إنشاء بيانات قذرة (أي ما يعادل هذه الطريقة التي لم يتم تنفيذها أبدًا). يمكن استخدام هذه الميزة في بعض الخدمات الخاصة ، ولا يمكن لـ Expression_required أو Expressation_Requires_New القيام بذلك.
ب. لا يقوم رمز التراجع/التزام المعاملة الخارجية بأي تعديلات. إذا كانت المعاملة الداخلية (Serviceb#methodb) تراجعًا ، فإن First ServiceB.Methodb تعيد إلى نقطة التوفير قبل تنفيذها (على أي حال) ، وستقرر المعاملة الخارجية (أي Servicea#methoda) ما إذا كانت ترتكب أو تراجعًا بناءً على التكوين المحدد.
سمات انتشار المعاملات الثلاثة الأخرى غير فعالة بشكل أساسي ، لذلك لا يتم إجراء أي تحليل هنا.
6. ملخص
بالنسبة للأماكن التي يلزم فيها المعاملات في المشروع ، أقترح أنه يجب على المطورين استخدام واجهة TransactionCallback الخاصة بـ Spring لتنفيذ المعاملات. لا تستخدم بشكل أعمى تعليقات معاملة الربيع. إذا كان يجب عليك استخدام التعليقات التوضيحية ، فيجب أن يكون لديك فهم مفصل لآلية الانتشار ومستوى العزلة لمعاملات الربيع ، وإلا فقد تحدث تأثيرات غير متوقعة.