سؤال

أريد أن أعرف ما يحدث فعلا عندما تعلق على طريقة @Transactionalب بالطبع، أعرف أن الربيع سوف التفاف هذه الطريقة في معاملة.

ولكن، لدي الشكوك التالية:

  1. سمعت أن الربيع يخلق فئة الوكيلب يمكن للشخص أن يفسر هذا في أكثر عمق. ما الذي يقيم فعلا في هذا الفئة الوكيل؟ ماذا يحدث للفصل الفعلي؟ وكيف يمكنني رؤية فصل الربيع المنشأ
  2. قرأت أيضا في مستندات الربيع التي:

ملاحظة: نظرا لأن هذه الآلية تستند إلى الوكلاء سيتم اعتراض مكالمات الأسلوب "الخارجية" فقط من خلال الوكيل. وبعد هذا يعني أن "الاحتجاج الذاتي"، أي طريقة داخل الكائن المستهدف الذي يطلق عليه طريقة أخرى للكائن المستهدف، لن يؤدي إلى معاملة حقيقية في وقت التشغيل حتى لو تم تمييز الطريقة المستحقة @Transactional!

مصدر: http://static.springsource.org/spring/docs/2.0.x/Reference/Transaction.html.

لماذا ستكون مكالمات الأسلوب الخارجي فقط قيد المعاملة وليس أساليب الاحتجاج الذاتي؟

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

المحلول

هذا موضوع كبير. المرجع الربيعي Doc تكرس فصول متعددة له. أوصي قراءة تلك على الجانب برمجة و المعاملات, ، كما يستخدم دعم المعاملات التصريحي الربيع AOP في مؤسسه.

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

المعاملات في EJB العمل بالمثل، بالمناسبة.

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

نصائح أخرى

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

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

بالنسبة إلى شيء "الطريقة الخارجية"، إذا استدعي الفول الخاص بك أحد أساليبها الخاصة، فلن يقوم بذلك عن طريق الوكيل. تذكر أن الربيع يلف فولك في الوكيل، فولك ليس لديه معرفة به. يدعو فقط من "خارج" فاصوليك تمر عبر الوكيل.

هل هذا يساعد؟

كشخص مرئي، أحب أن أزن مع مخطط تسلسل لنمط الوكيل. إذا كنت لا تعرف كيفية قراءة الأسهم، فقد قرأت أول واحد مثل هذا: Client تنفيذ Proxy.method().

  1. يدعو العميل طريقة على الهدف من منظوره، ويتم اعتراضه بصمت من الوكيل
  2. إذا تم تعريف الجانب قبل أن يتم تعريف الوكيل
  3. ثم، يتم تنفيذ الطريقة الفعلية (الهدف)
  4. بعد العودة وبعد الرمي هي جوانب اختيارية يتم تنفيذها بعد إرجاع الأسلوب و / أو إذا كانت الطريقة ترمي استثناء
  5. بعد ذلك، ينفذ الوكيل بعد الجانب بعد (إذا تم تحديده)
  6. وأخيرا، يعود الوكيل إلى عميل الاتصال

Proxy Pattern Sequence Diagram(سمح لي بنشر الصورة بشرط ذكر أنني ذكرت أصولها. المؤلف: Noel Vaes، موقع الويب: www.noelvaes.eu)

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

إذا كنت تستخدم دعوة JPA، فكل ما يرتكب مع حدود المعاملة هذه. دعونا نقول أنك تقوم بحفظ الكون 1، الكيان 2 والكيان 3. الآن أثناء حفظ الكيان 3 حدث استثناء، يأتي ANITIY1 و ENTITY2 في نفس المعاملة، لذلك سيتم التراجع عن كيان 1 والكيان 2 مع Entity3.

المعاملة: (Entity1.ave، Entity2.save، Entity3.save). سيؤدي أي استثناء إلى استعادة جميع معاملات JPA مع DB. يتم استخدام معاملة JPA داخليا بحلول الربيع.

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