2012-10-24 14 views
30

मैं एक विधि propagation = Propagation.REQUIRES_NEW व्यवहार संपत्ति है कि है:स्प्रिंग लेन-देन बनाम REQUIRES_NEW आवश्यक: रोलबैक लेन-देन

@Transactional(propagation = Propagation.REQUIRES_NEW) 
public void createUser(final UserBean userBean) { 
    //Some logic here that requires modification in DB 
} 

इस विधि को कई बार एक साथ कहा जा सकता है, और प्रत्येक लेनदेन के लिए की तुलना में एक त्रुटि होती है तो यह वापस लुढ़का है (स्वतंत्र रूप से अन्य लेनदेन से)।

समस्या यह है कि यह वसंत को कई लेनदेन बनाने के लिए मजबूर कर सकता है, भले ही कोई दूसरा उपलब्ध हो, और कुछ प्रदर्शन समस्याएं हो सकती हैं।


propagation = Propagation.REQUIRED के जावा दस्तावेज़ का कहना है: Support a current transaction, create a new one if none exists.

इस प्रदर्शन समस्या को हल करने लगता है, यह नहीं है कि यह?

रोलबैक मुद्दे के बारे में क्या? यदि मौजूदा लेनदेन का उपयोग करते समय कोई नई विधि कॉल वापस आती है तो क्या होगा? क्या वह पूरे लेनदेन को पिछली कॉल भी नहीं करेगा?

[संपादित करें] मुझे लगता है कि मेरे सवाल का काफी स्पष्ट नहीं था:

हम अपने सर्वर से कनेक्ट ग्राहकों के सैकड़ों है।

प्रत्येक ग्राहक के लिए हमें स्वाभाविक रूप से लेनदेन (ठीक या अपवाद -> रोलबैक) के बारे में प्रतिक्रिया भेजने की आवश्यकता होती है।

मेरा प्रश्न है: यदि मैं REQUIRED का उपयोग करता हूं, तो इसका मतलब है कि केवल एक लेनदेन का उपयोग किया जाता है, और यदि 100 वें ग्राहक को किसी समस्या का सामना करना पड़ता है तो पहले ग्राहक का लेनदेन भी रोलबैक होगा?

+1

जो कि विधि के हर बार नए लेनदेन बनाने के लिए, REQUIRES_NEW का बिंदु है। और हाँ, अगर आपको आवश्यकता है और लेनदेन वापस लुढ़का है, तो यह पूरी चीज वापस ले जाएगा। –

+0

@DenisTulskiy पूरी चीज उस फॉनक्शन, या वर्तमान कॉल स्टैक के लिए हर पिछली कॉल होने जा रही है? –

+2

@jidma: पूरा लेनदेन, @ यूजीन का उत्तर देखें, यदि 'createUser' आपके क्लाइंट कोड का पहला तरीका है, तो REQUIRES_NEW और आवश्यक एक ही चीज़ –

उत्तर

48

REQUIRES_NEW का उपयोग केवल तभी प्रासंगिक होता है जब विधि को लेनदेन संबंधी संदर्भ से लागू किया जाता है; जब विधि गैर-लेनदेन संदर्भ से लागू की जाती है, तो यह बिल्कुल REQUIRED के रूप में व्यवहार करेगी - यह एक नया लेनदेन तैयार करेगी।

इसका मतलब यह नहीं है कि आपके सभी ग्राहकों के लिए केवल एक ही लेनदेन होगा - प्रत्येक क्लाइंट गैर-लेनदेन संबंधी संदर्भ से शुरू होगा, और जैसे ही अनुरोध प्रसंस्करण @Transactional पर पहुंच जाएगा, यह एक नया बना देगा लेन-देन।

तो, इस बात को ध्यान में रखते हुए, REQUIRES_NEW का उपयोग उस ऑपरेशन के अर्थशास्त्र के लिए समझ में आता है - इससे मैं प्रदर्शन के बारे में चिंता नहीं करता - यह पाठ्यपुस्तक समयपूर्व अनुकूलन करेगा - मैं बल्कि शुद्धता और डेटा अखंडता पर दबाव डालना चाहता हूं और प्रदर्शन के बारे में चिंता करता हूं एक बार प्रदर्शन मीट्रिक एकत्र किए गए हैं, और पहले नहीं।

रोलबैक पर - REQUIRES_NEW का उपयोग करके एक नए लेनदेन की शुरुआत को मजबूर कर दिया जाएगा, और इसलिए एक अपवाद लेनदेन को रोलबैक करेगा। यदि एक और लेनदेन भी है जो निष्पादन भी कर रहा था - अगर अपवाद ब्लेड को ढेर करता है या पकड़ा जाता है - ऑपरेशन के विनिर्देशों के आधार पर आपकी पसंद के आधार पर वापस लुढ़का नहीं जाएगा। इसके अलावा, लेनदेन संबंधी रणनीतियों और रोलबैक पर अधिक गहन चर्चा के लिए, मैं अनुशंसा करता हूं: «Transaction strategies: Understanding transaction pitfalls», Mark Richards

+0

क्या आप इस प्रश्न को देख सकते हैं https://stackoverflow.com/questions/44539861/spring-transactional-commit-failures-deby-eclipselink? क्या मुझे 'REQUIRES_NEW' की आवश्यकता है, बाद में कुछ समय बाद इसे वापस ले जाने के बाद पेस्टिस्ट के बाद प्रतिक्रिया दी गई। – vels4j

10

यदि आपको वास्तव में अलग लेनदेन में ऐसा करने की आवश्यकता है तो आपको REQUIRES_NEW का उपयोग करने और प्रदर्शन ओवरहेड के साथ रहने की आवश्यकता है। मृत ताले के लिए बाहर देखो।

  • मान्य जावा तरफ डेटा:

    मैं नहीं बल्कि यह अन्य तरीके से करना चाहते हैं।

  • एक लेनदेन में हर चीज चलाएं।
  • यदि डीबी पक्ष पर कुछ भी गलत हो जाता है -> यह डीबी या सत्यापन डिजाइन की एक बड़ी त्रुटि है। सबकुछ रोलबैक करें और महत्वपूर्ण शीर्ष स्तर त्रुटि फेंक दें।
  • अच्छे यूनिट परीक्षण लिखें।
+0

हमारे पास हमारे सर्वर से जुड़े सैकड़ों ग्राहक हैं। प्रत्येक ग्राहक के लिए हमें लेनदेन (ठीक या अपवाद -> रोलबैक) के बारे में एक प्रतिक्रिया भेजने की आवश्यकता है। मेरा सवाल बनी हुई है: यदि मैं 'रिक्वेर्ड' का उपयोग करता हूं, तो इसका मतलब है कि केवल एक लेनदेन का उपयोग किया जाता है, और यदि 100 वें ग्राहक को किसी समस्या का सामना करना पड़ता है तो पहले ग्राहक का लेनदेन रोलबैक होगा? –

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