2011-11-09 11 views
7

मेरे पास एक @Service क्लास है जिसमें एक @ ट्रान्सैक्शनल विधि है जो एक ही कक्षा पर एक और @ ट्रांसेक्शन विधि को कॉल करती है। मैं इसके लिए रोलबैक व्यवहार का परीक्षण कर रहा था और मैंने पाया कि यह ठीक से काम नहीं कर रहा था। कोड इस तरह दिखता है:स्प्रिंग नेस्टेड @ ट्रान्सैक्शनल विधि और रोलबैक

@Service 
public class DefaulService implements ervice 
{ 
    @Transactional 
    public void methodOne() 
    { 
     methodTwo(); 

      //question edited 
      //this seems to be the problem 
      this.serviceDAO.executeUpdateOperation(); 

     //test rollback 
     throw new RuntimeException(); 
    } 

    @Transactional 
    public void methodTwo() 
    { 
     //DAO stuff 
    } 
} 

methodone चल रहा डेटाबेस की जाँच करें और परिवर्तन होते हैं के बाद, भले ही लॉग दिखाता है "JDBCTransaction - रोलबैक"।

यदि मैं विधि को अलग-अलग कॉल करता हूं और इसके अंत में अपवाद जोड़ता हूं, तो परिवर्तन सही ढंग से वापस लुढ़क जाते हैं।

क्या कोई तरीका है विधि को सही तरीके से रोलबैक परिवर्तन जो नेस्टेड @ ट्रांसेक्शन कॉल के दौरान हुआ था? मैं इस धारणा के तहत था कि रिक्वेर्ड का डिफ़ॉल्ट प्रचार यह प्राप्त करेगा, लेकिन ऐसा लगता है कि यह काम नहीं कर रहा है। धन्यवाद

अद्यतन

ठीक है, मैं तो बस कुछ और देखा। अपवाद फेंकने से ठीक पहले, मैं सेवा के दाओ को फोन कर रहा हूं और 'executeUpdate' के माध्यम से मैन्युअल अपडेट कर रहा हूं। अगर मैं इस लाइन पर टिप्पणी करता हूं, तो नेस्टेड रोलबैक काम करता है। तो ऐसा लगता है कि समस्या वास्तव में डीएओ को बुला रही है और executeUpdate क्वेरी चला रही है। लेकिन क्या यह वर्तमान लेनदेन के अंदर भी नहीं चलना चाहिए?

+0

आप जानते हैं कि जब 'methodTwo()' 'methodone से()' 'बुला @ पूर्व से अधिक Transactional' एनोटेशन नजरअंदाज कर दिया है कर रहे हैं? अधिक जानकारी के लिए मेरे [लेख] (http://nurkiewicz.blogspot.com/2011/10/spring-pitfalls-proxying.html) देखें। हालांकि यह आपकी समस्याओं का कारण नहीं है, लेकिन जानना लायक है। –

+0

हां, लेकिन चूंकि विधिTwo को स्वतंत्र रूप से बुलाया जा सकता है, इसलिए इसे ऐसे मामलों के लिए अपनी एनोटेशन की आवश्यकता है। अभी मैं स्टंप हो गया हूं कि executeUpdate लेनदेन को क्यों करने का कारण बनता है, हालांकि शायद यह डिफ़ॉल्ट व्यवहार है। – JayPea

+1

सेवादाओ का लेनदेन प्रचार क्या है? क्या यह किसी भी मौके से REQUIRES_NEW है? – Hendrik

उत्तर

1

जब आप विधियों को कॉल करते हैं, तो आप निश्चित रूप से बीन कारखाने से "ervice" का उदाहरण प्राप्त कर रहे हैं, है ना? बीन कारखाने को एक प्रॉक्सी स्थापित करने की आवश्यकता होती है जो प्रत्येक विधि कॉल के आसपास लेनदेन संबंधी तर्क लागू करता है। मैं इस धारणा के तहत था कि यह केवल तब काम करता था जब "बाहरी लोग" प्रॉक्सी के माध्यम से तरीकों का आह्वान करते हैं, और जब कोई विधि किसी अन्य विधि को कॉल करती है तो यह आवश्यक नहीं है, क्योंकि यह विधि कार्यान्वयन ऑब्जेक्ट के अंदर एक सीधी कॉल है और एओपी प्रॉक्सी के माध्यम से नहीं जाती है।

+0

यह इस बात पर निर्भर करता है कि आप किस प्रकार के एओपी दृष्टिकोण का उपयोग कर रहे हैं। चेक टोमाज़ Nurkiewicz से [कड़ी] (http://nurkiewicz.blogspot.com/2011/10/spring-pitfalls-proxying.html)। इसके अलावा जेपीए का वर्णन करने वाले व्यवहार की व्याख्या नहीं कर सकता है। –

संबंधित मुद्दे