سؤال

في واحد داو لدي 2 طرق transactional.

إذا لم أقدم أي خصائص صريحة ،

ثم ماذا سيحدث ، إذا

أدير طريقة في جسم آخر؟

ستعمل كلتا الطريقتين في نفس المعاملة؟

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

المحلول

وكلاء في الربيع AOP

عند استخدام المعاملات ، أنت تتعامل مع وكلاء الفصول ، لذلك في هذا السيناريو:

@Transactional
public void doSomeThing(){ // calling this method targets a proxy

    doSomeThingElse(); // this method targets the actual class, not the PROXY,
                       // so the transactional annotation has no effect
}

@Transactional
public void doSomeThingElse(){
}

أنت تتصل بالوكالة من الخارج ، ولكن يتم إجراء استدعاء الطريقة الثانية من داخل الكائن المؤيد ولا يوجد أي دعم للمعاملات. بطبيعة الحال ، فإنها تعمل في نفس المعاملة ، بغض النظر عن قيم التعليق التوضيحي @transactional في الطريقة الثانية

لذلك إذا كنت بحاجة إلى معاملات منفصلة ، فيجب عليك الاتصال

yourservice.doSomething();
yourservice.doSomethingElse();

من الخارج.

يتم شرح السيناريو بأكمله جيدًا في الفصل الربيع aop> فهم الوكلاء AOP, ، بما في ذلك "الحل":

الوصول إلى كائن وكيل AOP الحالي من الداخل

public class SimplePojo implements Pojo {

   public void foo() {
      // this works, but... gah!
      ((Pojo) AopContext.currentProxy()).bar();
   }

   public void bar() {
      // some logic...
   }
}

نصائح أخرى

القيمة الافتراضية لـ propagation سمة @Transactional هو REQUIRED, مما يعني:

دعم معاملة حالية ، قم بإنشاء معاملة جديدة في حالة عدم وجود.

لذا نعم - سيتم تشغيل كلتا الطريقتين في نفس المعاملة.

لكن نصيحة واحدة: لا تجعل معاملات DAO الخاصة بك. يجب أن تكون الخدمات معاملات ، وليس DAO.

وثيقة الربيع

ملاحظة واحدة:

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

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