2011-08-16 9 views
34

मेरे पास कुछ विरासत कोड है जो अब मैं वसंत के तहत पुनः उपयोग करने की कोशिश कर रहा हूं। यह कोड अन्य कोड में गहराई से घिरा हुआ है, इसलिए यह फिर से डिजाइन करने के लिए व्यावहारिक नहीं है और कई परिस्थितियों में बुलाया जाता है, जिनमें से कुछ वसंत के माध्यम से होते हैं। यदि मैं शुरू कर चुका हूं तो वसंत लेनदेन का उपयोग करना मैं क्या करना चाहता हूं; अन्यथा, मौजूदा (विरासत) डीबी कनेक्शन तंत्र का उपयोग करना जारी रखें। हमारा पहला विचार हमारी विरासत कक्षा को एक बीन बनाना था और एक इंजेक्शन TransactionPlatformManager का उपयोग करना था, लेकिन ऐसा लगता है कि हमारी स्थिति के लिए कोई तरीका जर्मनी नहीं है। कुछ शोध से पता चला है कि वसंत में TransactionSynchronizationManager नामक एक वर्ग है जिसमें एक स्थिर विधि isActualTransactionActive() है। मेरे परीक्षण इंगित करता है इस विधि का पता लगाने अगर एक स्प्रिंग लेन-देन सक्रिय है की एक विश्वसनीय तरीका है:क्या लेनदेन सिंक्रनाइज़ेशनमैनेजर.इसएक्टुअल ट्रांज़ेक्शनएक्टिव() का उपयोग करने से स्प्रिंग डीबी लेनदेन सक्रिय है या नहीं, इसका पता लगाने का कोई बेहतर तरीका है?

  • जब @Transactional एनोटेशन के बिना स्प्रिंग सेवा के माध्यम से कहा जाता है, यह रिटर्न झूठी
  • जब @Transactional साथ स्प्रिंग सेवा के माध्यम से कहा जाता है, यह रिटर्न सच
  • मेरी विरासत विधि में मौजूदा तरीका कहा जाता है, यह रिटर्न झूठी

मेरा प्रश्न: वहाँ का पता लगाने अगर एक सौदे सक्रिय है की एक बेहतर तरीका है?

उत्तर

37

TransactionSynchronizationManager.isActualTransactionActive() से बेहतर तरीका नहीं है। लेनदेन को संभालने के लिए वसंत द्वारा उपयोग की जाने वाली उपयोगिता विधि है। यद्यपि इसे आपके कोड के भीतर उपयोग करने की सलाह नहीं दी जाती है, लेकिन कुछ विशिष्ट मामलों के लिए आपको यह करना चाहिए - यही कारण है कि यह सार्वजनिक है।

इकाई प्रबंधक/सत्र/कनेक्शन का उपयोग करने का एक और तरीका हो सकता है और यदि मौजूदा लेनदेन हो तो वहां जांचें, लेकिन मैं सिंक्रनाइज़ेशन प्रबंधक को प्राथमिकता दूंगा।

+0

धन्यवाद! यह बिल्कुल सही है. – fool4jesus

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