मेरा उत्तर अपडेट कर रहा है:
- आप चाहते हैं कि आपकी "सार्वजनिक उद्धरण बचत (उद्धरण उद्धरण)" विधि लेन-देन वाली हो।
- जब इस पद्धति को लागू किया जाता है ... लेन-देन TransactionInterceptor में शुरू होता है और प्रॉक्सी से "सार्वजनिक उद्धरण सहेजें (उद्धरण उद्धरण)" लागू किया जाता है
- लाइन "quoteLineDao.delete(new Long(44));" ठीक काम करता है
- लाइन "System.out.println("°°°°°°°°°°°°°°°°°°°, लाइन 44 हटा दिया गया");" ठीक काम करता है
- लाइन "quoteDao.save(quote);" बाधा उल्लंघन अपवाद देता है। लेन-देन को रोलबैक के रूप में चिह्नित किया गया है
- आप इस अपवाद को पकड़ रहे हैं और इसका उपभोग कर रहे हैं और अपवाद का प्रचार नहीं कर रहे हैं
- विधि "सार्वजनिक भाव सहेजें(उद्धरण उद्धरण)" लाइन "वापसी शून्य" के कारण शून्य वापस आ जाएगी;
- अब कोड ट्रांजेक्शन इंटरसेप्टर तक पहुंच गया है और चूंकि इस इंटरसेप्टर में कोई अपवाद नहीं था, यह कमिट करने की कोशिश करता है लेकिन ट्रांजैक्शन पहले से ही रोलबैक के रूप में चिह्नित है और इसलिए विफल हो जाता है।
समाधान:- आपको अपवाद का उपभोग नहीं करना चाहिए और इसके बजाय अपनी लेन-देन की आवश्यकता के कारण अपवाद का प्रचार करना चाहिए।
निम्नलिखित में बदलें। थ्रो स्टेटमेंट जोड़ा है।
try{
quoteLineDao.delete(new Long(44));
System.out.println("°°°°°°°°°°°°°°°°°°Line 44 deleted");
return quoteDao.save(quote);
} catch(Exception e){
Logger.getLogger(QuoteService.class).log(Logger.Level.ERROR, e);
throw e;
}
चरण दर चरण स्पष्टीकरण इस लिंक में उपलब्ध है:जेपीए लेन-देन नहीं कर सका:लेन-देन केवल रोलबैक के रूप में चिह्नित किया गया