java - Starting new transaction in Spring bean -


हमारे पास है:

  @ ट्रान्सैक्जिलिकल (प्रचार = प्रचार.रेक्वार्ड) सार्वजनिक वर्ग मायक्लॉस कार्यान्वयन MyInterface {...  

MyInterface में एक ही विधि है: go ()

जब हम () कार्यान्वित करते हैं तो हम एक नया लेन-देन शुरू करते हैं जो विधि पूरा होने पर / रोलबैक करते हैं - यह ठीक है।

अब हम कहते हैं () हम एक निजी विधि कहते हैं ऐसा लगता है कि स्प्रिंग "REQUIRES_NEW एनोटेशन पर ध्यान नहीं देता" और एक नया लेन-देन प्रारंभ नहीं करता है। मेरा मानना ​​है कि यह इसलिए है क्योंकि स्प्रिंग एओपी इंटरफ़ेस स्तर पर चल रही है (MyInterface) और MyClass विधियों के लिए किसी भी कॉल को रोकना नहीं है। क्या यह सही है?

क्या (लेनदेन) के भीतर एक नया लेन-देन शुरू करने का कोई तरीका है?

अद्यतन

तो इंटरफ़ेस के संदर्भ के आधार पर, वर्ग नहीं:

  @ एटोवायर माय इंफर्फेस इंफॉर्म; impl.go ();  

वें से ई स्प्रिंग संदर्भ 2.5:

प्रॉक्सी का उपयोग करते समय, @ ट्रांसेसैक्शन एनोटेशन केवल सार्वजनिक दृश्यता के तरीकों पर लागू किया जाना चाहिए यदि आप संरक्षित, निजी या पैकेज-दृश्य तरीकों को @ ट्रांसेसैक्शन एनोटेशन के साथ एनोटेट करते हैं, तो कोई त्रुटि नहीं उठाई जाएगी, लेकिन एनोटेट की गई विधि कॉन्फ़िगर किए लेन-देन सेटिंग को प्रदर्शित नहीं करेगी।

इसके अलावा,

प्रॉक्सी मोड में (जो कि डिफ़ॉल्ट है)

इस प्रकार, स्प्रिंग गैर-सार्वजनिक विधियों पर @ ट्रांसेसैक्शन एनोटेशन की उपेक्षा करता है। ), प्रॉक्सी के माध्यम से आने वाले केवल 'बाहरी' विधि कॉल को इंटरसेप्टेड किया जाएगा। इसका अर्थ है कि 'आत्म-आह्वान' अर्थात लक्ष्य वस्तु के किसी अन्य तरीके से लक्ष्य वस्तु के भीतर एक विधि, रनटाइम पर वास्तविक लेनदेन के लिए आगे नहीं बढ़ेगी, भले ही आविष्कृत विधि @ Transactional !

यहां तक ​​कि अगर आप अपना तरीका सार्वजनिक बनाते हैं, तो उसे उसी क्लास की किसी विधि से कॉल करने से कोई नया लेन-देन नहीं शुरू होगा।

आप लेन-देन की सेटिंग्स में aspectj मोड का उपयोग कर सकते हैं ताकि लेनदेन संबंधित कोड वर्ग में बुने जाये और रनटाइम पर कोई प्रॉक्सी नहीं बनाई जा।

अधिक जानकारी के लिए देखें। < / P>

ऐसा करने का एक और संभावित तरीका क्लास में वसंत का प्रॉक्सी ला रहा है और इसे इस :

  के बजाय कॉल विधियों को प्राप्त कर रहा है। @ सेवा @ ट्रांसिजनल (प्रचार = प्रचार .रेक्वार्ड) सार्वजनिक वर्ग के कुछ सेवा {@ एटोवायर निजी अनुप्रयोगान्तरित एप्लिकेशन कोन्टेक्स; निजी SomeService getSpringProxy () {वापसी आवेदनकॉन्टेक्स .getBean (this.getClass ()); } प्राइवेट व्होइड डूमेम एंड टेंन मोर () {// के बजाय // यह। डोमेटिंगिंग पब्लिकली (); // लेनदेन में चलने के लिए निम्न करेंप्रोस्टिंगप्रोक्सी ()। DoSometingPublicly (); } सार्वजनिक शून्य doSometingPublicly () {// कुछ व्यवहार सामान यहाँ}}  

Comments