طريقة الربيع transactional - المعاملة المشاركة
-
30-09-2019 - |
سؤال
في واحد داو لدي 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.