2012-05-02 28 views
29

में वसंत लेन-देन का उपयोग करने के मैं नीचे के रूप में एक विधि है:कैसे multithread

ClassA.java 
@Transactional 
public void methodA(){   
    ExecutorService executorService = Executors.newFixedThreadPool(4); 
    executorService.execute(new Runnable() { 
     public void run() { 
      classB.methodB(); 
     } 
}); 
} 
ClassB.java 
@Transactional 
public void methodB(){ 
    updateDB(); 
} 

methodB अच्छी तरह से काम कर सकते हैं? मेरी समझ के अनुसार, methodB विधि ए के लेनदेन को संलग्न करेगा, अगर विधि ए विधि से पहले बाहर निकलता है तो क्या होगा? मुझे लगता है कि केवल विधि ए लेनदेन द्वारा किया जा सकता है। लेकिन methodB प्रतिबद्ध नहीं होगा क्योंकि लेनदेन पहले किया गया था।

क्या मैं methodB के लिए @Transactional (प्रचार = प्रचार। REQUIRES_NEW) का उपयोग कर सकता हूं। यह विधि बी को एक नया लेनदेन दे सकता है। लेकिन वसंत डॉक्टर के अनुसार, विधि ए का स्थानांतरण जब यह विधि बी का आह्वान करेगा। मैं यहाँ बहुत उलझन में महसूस करता हूँ।

क्या कोई इस मुद्दे पर मेरी सहायता कर सकता है? अग्रिम में धन्यवाद।

+0

आप वास्तव में क्या करना चाहते हैं? –

उत्तर

23

नहीं, methodB() उसी लेनदेन में methodA() के रूप में निष्पादित नहीं किया जाएगा। वसंत का @Transactional केवल एक ही थ्रेड पर काम करता है - यह एक सत्र बनाता है जब थ्रेड पहले @Transactional (या @Transactional के साथ कक्षा में एक विधि) के साथ एक विधि में प्रवेश करता है, और उसके बाद यह विधि छोड़ देता है।

आपके उदाहरण में, थ्रेड पूल में नौकरी निर्धारित करने के बाद लेनदेन समाप्त हो जाएगा। methodB() का अपना लेनदेन होगा।

+0

क्या आप सलाह दे सकते हैं कि अगर वे एक ही लेनदेन नहीं हैं तो निगरानी कैसे करें? मुझे जो मिला वह यह था कि लेनदेन प्रतिबद्ध नहीं था। – Jacky

+0

@ जैकी दो लेनदेन में से कौन सा प्रतिबद्ध नहीं है? – jmruc

+0

विधि बी का लेनदेन प्रतिबद्ध नहीं है। – Jacky