2013-08-14 8 views
14

मेरे पास @Transactional एनोटेशन (इसकी सभी विधि के लिए इसे चिह्नित करने के बजाय) के साथ एक कक्षा है।पूरे वर्ग पर लेनदेन संबंधी एनोटेशन + एक विधि को छोड़कर

हालांकि मेरे पास उस कक्षा के अंदर एक ही विधि है जिसे @Transactional के रूप में एनोटेट नहीं किया जाना चाहिए।

मेरा प्रश्न यह है कि मैं इस विधि में "गैर-लेनदेन" के रूप में चिह्नित करने के लिए एक टिप्पणी कर सकता हूं? या मुझे इस विधि को छोड़कर "लेनदेन" के रूप में इस विधि में प्रत्येक विधि को चिह्नित करना चाहिए (बहुत सारे काम)

धन्यवाद।

+1

क्या आपने '@ ट्रान्सएक्शनल (प्रचार = NOT_ समर्थित)' की कोशिश की है? –

उत्तर

21

उपयोग करने के लिए विभिन्न लेनदेन प्रचार रणनीतियां हैं। ये enum Propagation में मौजूद हैं। जिनके लिए आप उपयोग करना चाहते हैं वे

/** 
* Execute non-transactionally, suspend the current transaction if one exists. 
* Analogous to EJB transaction attribute of the same name. 
* <p>Note: Actual transaction suspension will not work on out-of-the-box 
* on all transaction managers. This in particular applies to JtaTransactionManager, 
* which requires the {@code javax.transaction.TransactionManager} to be 
* made available it to it (which is server-specific in standard J2EE). 
* @see org.springframework.transaction.jta.JtaTransactionManager#setTransactionManager 
*/ 
NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED), 

/** 
* Execute non-transactionally, throw an exception if a transaction exists. 
* Analogous to EJB transaction attribute of the same name. 
*/ 
NEVER(TransactionDefinition.PROPAGATION_NEVER), // maybe not this one 

तो इनमें से किसी के साथ अपनी कक्षा के अंदर विधि को एनोटेट करें।

@Transactional 
public class MyTransactionalClass { 
    @Transactional(propagation = PROPAGATION_NOT_SUPPORTED) 
    public void nonTransactionalMethod() {...} 
} 

आप सभी प्रचार रणनीतियों here पा सकते हैं।

+0

यह मुझे गैर-काम करने वाले "readOnly = true" –

+0

के साथ समस्या को हल करने में मदद करता है या तो NOT_SUPPORTED या कभी भी विकल्प का सुझाव नहीं है। डेवलपर्स को इसका उपयोग करने के लिए बहुत सावधान रहना चाहिए क्योंकि इससे रनटाइम पर अप्रत्याशित अपवाद हो सकते हैं। यदि लेनदेन निलंबन समर्थित नहीं है (javadoc देखें) NOT_ समर्थित विकल्प काम नहीं कर सकता है। यदि लेनदेन के भीतर विधि को गोपनीय रूप से बुलाया जाता है तो कभी अपवाद नहीं फेंक देगा। डेवलपर्स को सपोर्ट विकल्प पर विचार करना चाहिए क्योंकि जहां भी इसे बुलाया जाता है, वह खुशी से काम करेगा। जब तक कभी कथित तौर पर इरादा नहीं किया जाता है। – coolersport

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