मेरे पास एक @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 क्वेरी चला रही है। लेकिन क्या यह वर्तमान लेनदेन के अंदर भी नहीं चलना चाहिए?
आप जानते हैं कि जब 'methodTwo()' 'methodone से()' 'बुला @ पूर्व से अधिक Transactional' एनोटेशन नजरअंदाज कर दिया है कर रहे हैं? अधिक जानकारी के लिए मेरे [लेख] (http://nurkiewicz.blogspot.com/2011/10/spring-pitfalls-proxying.html) देखें। हालांकि यह आपकी समस्याओं का कारण नहीं है, लेकिन जानना लायक है। –
हां, लेकिन चूंकि विधिTwo को स्वतंत्र रूप से बुलाया जा सकता है, इसलिए इसे ऐसे मामलों के लिए अपनी एनोटेशन की आवश्यकता है। अभी मैं स्टंप हो गया हूं कि executeUpdate लेनदेन को क्यों करने का कारण बनता है, हालांकि शायद यह डिफ़ॉल्ट व्यवहार है। – JayPea
सेवादाओ का लेनदेन प्रचार क्या है? क्या यह किसी भी मौके से REQUIRES_NEW है? – Hendrik