यह annotation proxy से लागू होता है, इसलिए यह तभी असर करता है जब call bean के जरिए बाहर से आए। उसी class के किसी दूसरे method से की गई call proxy को पूरी तरह छोड़ देती है, और यही सबसे आम वजह है। बाकी वजहें: method public नहीं है, फेंका गया exception checked है इसलिए डिफॉल्ट रूप से rollback नहीं होता, bean container के बाहर बना था, या नया transaction चाहिए था और propagation required ही छोड़ दिया गया।
इंटरव्यूअर यह क्यों पूछते हैं
यह Spring का व्यावहारिक सवाल है जिसके कई सही जवाब हैं, तो यह गहराई और असली डिबगिंग का तजुर्बा दोनों दिखाता है। इंटरव्यूअर चाहते हैं कि सबसे पहले proxy वाली self invocation की बात आए, साथ में checked exceptions पर rollback का नियम, जो लोगों को चौंकाता है। फॉलो अप आमतौर पर propagation की तरफ जाते हैं, कि transaction के भीतर क्या होना चाहिए, और connection पकड़े रखने वाले लंबे transactions खतरनाक क्यों हैं।
अपना जवाब कैसे स्ट्रक्चर करें
- proxy मॉडल से शुरू करें, क्योंकि ज्यादातर नाकामियां वही समझाता है।
- self invocation और visibility की शर्तें कवर करें।
- डिफॉल्ट rollback नियम बताएं और उसे बदलने का तरीका भी।
- यह भी जोड़ें कि transaction के भीतर क्या बिल्कुल नहीं होना चाहिए।
उदाहरण जवाब
दस में नौ बार यह self invocation ही होता है। Spring bean को एक proxy में लपेट देता है, और transaction तब शुरू होता है जब caller उस proxy से होकर आए, तो अगर उसी class का कोई public method उस annotated method को सीधे कॉल करे, तो call ऑब्जेक्ट से बाहर जाती ही नहीं और कोई transaction शुरू नहीं होता। उपाय है उस method को किसी दूसरे bean में ले जाना या bean को खुद में inject करना, और ईमानदार उपाय आमतौर पर यह निकलता है कि boundary वैसे भी गलत जगह थी। उसके बाद मैं बुनियादी चीजें जांचता हूं: method public होना चाहिए, bean new से बना नहीं, Spring का संभाला हुआ होना चाहिए, और rollback का नियम लोगों को चौंकाता है क्योंकि डिफॉल्ट रूप से rollback सिर्फ unchecked exceptions पर होता है, तो checked exception commit कर देता है जब तक मैं rollbackFor न बताऊं। मैं propagation भी देखता हूं, क्योंकि जो काम caller के rollback के बाद भी टिकना चाहिए उसे requires new चाहिए, और उसमें दूसरा connection लगता है, जो pool छोटा होने पर मायने रखता है। और मैं transactions छोटे रखता हूं: भीतर कोई HTTP call नहीं, कोई message publishing नहीं, किसी चीज का इंतजार नहीं, क्योंकि किसी third party को कॉल करते वक्त डेटाबेस connection पकड़े रखना ही pool खत्म कराने का तरीका है।
जल्दी ही यह इंटरव्यू देने जा रहे हैं? GhostPilot आपकी लाइव कॉल सुनता है, सवाल पूछे जाते ही उसे पकड़ लेता है, और रियल-टाइम में एक स्ट्रक्चर्ड जवाब आपकी स्क्रीन पर डाल देता है। अगले मॉक में इसे आजमाएं, या ले लें एक $29 Session Pass, कोई सब्सक्रिप्शन नहीं, असली इंटरव्यू के लिए।
देखें यह कैसे काम करता हैफॉलो-अप सवाल जिनकी उम्मीद रखें
- propagation requires new असल में connection pool के साथ क्या करता है?
- transaction के भीतर exception पकड़ लेने के बाद भी rollback क्यों हो सकता है?
- आप कोई event सिर्फ transaction commit होने के बाद कैसे publish करेंगे?
Java डेवलपर के और सवाल
आपका इंटरव्यूअर इसका अपना वर्ज़न पूछेगा। फ्री Question Predictor में अपना असली जॉब डिस्क्रिप्शन पेस्ट कीजिए और वो 20 सवाल पाइए जो उस रोल में सबसे ज्यादा पूछे जाने की संभावना है, साथ में यह भी कि हर सवाल असल में क्या टटोल रहा है।
मेरे सवाल प्रेडिक्ट करें