जैसा कि मैं इसे समझता हूं, सभी लेन-देन थ्रेड-बाउंड होते हैं (यानी थ्रेडलोकल में संग्रहीत संदर्भ के साथ)। उदाहरण के लिए यदि:एकाधिक धागे समाधान में एकल लेनदेन
- मैं एक व्यवहार माता पिता विधि में कोई लेनदेन शुरू एक अतुल्यकालिक कॉल में
- मेक डेटाबेस डालने # 1 एक और अतुल्यकालिक कॉल में
- मेक डेटाबेस डालने # 2
फिर जो दो अलग-अलग लेन-देन (प्रत्येक डालने के लिए एक) उत्पन्न करेगा, भले ही उन्होंने एक ही "लेनदेन" माता-पिता को साझा किया हो।
उदाहरण के लिए, मान लीजिए कि मैं दो आवेषण प्रदर्शन करते हैं (और एक बहुत ही सरल नमूना का उपयोग कर, एक प्रबंधक या संक्षिप्तता के लिए completable भविष्य, आदि का उपयोग नहीं कर आईई):
@Transactional
public void addInTransactionWithAnnotation() {
addNewRow();
addNewRow();
}
दोनों आवेषण प्रदर्शन करेंगे, के रूप में वांछित , एक ही लेनदेन के हिस्से के रूप में।
हालांकि, अगर मैं प्रदर्शन के लिए उन आवेषण parallelize करना चाहता था:
@Transactional
public void addInTransactionWithAnnotation() {
new Thread(this::addNewRow).start();
new Thread(this::addNewRow).start();
}
तब उन पैदा धागे में सभी लेनदेन में भाग लेने नहीं होगा क्योंकि लेनदेन थ्रेड बाध्य कर रहे हैं में से हर एक।
मुख्य प्रश्न: क्या बच्चे के धागे को लेनदेन को सुरक्षित रूप से प्रसारित करने का कोई तरीका है?
केवल समाधान मैं इस समस्या को हल करने के बारे में सोचा गया है:
- उपयोग JTA या कुछ XA प्रबंधक, जो परिभाषा द्वारा यह करने के लिए सक्षम होना चाहिए। हालांकि, मैं आदर्श रूप से अपने समाधान के लिए XA का उपयोग नहीं करना चाहता क्योंकि इसकी ओवरहेड
- मेरे द्वारा किए गए सभी लेनदेन कार्यों को पाइप करें (उपर्युक्त उदाहरण में,
addNewRow()
फ़ंक्शन) एक ही थ्रेड पर, और सभी बहुप्रचारित फैशन में पूर्व कार्य। - लेनदेन की स्थिति पर इनहेरटेबल थ्रेडलोकल का लाभ उठाने के लिए कुछ तरीके का पता लगाना और इसे बच्चों के धागे में प्रचारित करना। मुझे यकीन नहीं है कि यह कैसे करें।
कुछ और ऐसे समाधान संभव हैं? भले ही यह एक कामकाज की तरह थोड़ा स्वाद लेता है (जैसे ऊपर मेरे समाधान)?
कार्यबल धागे को व्यवहार्य समाधान के रूप में पुष्टि करने के लिए धन्यवाद। क्या आप इस समाधान को लागू करने के तरीके पर थोड़ा और प्रकाश डालने पर ध्यान देते हैं? अधिक विशेष रूप से; अगर वह धागा उस कामकाज का हिस्सा बनने के लिए अधिक काम के लिए मतदान करेगा, तो यह कब पता चलेगा कि कब पूरा करना है? इसके अतिरिक्त, यह वास्तव में वर्तमान लेनदेन को पूरा करने के लिए कैसे आगे बढ़ेगा जो इसे पहले से शुरू हो चुका है और तैयार होने पर इसे शुरू करने के लिए तैयार रहें? – Dovmo
आप निम्नलिखित उदाहरण का अध्ययन करके शुरू कर सकते हैं http://javarevisited.blogspot.com.es/2012/02/producer-consumer-design-pattern-with.html?m=1 – gpeche