मेरे पास एक संग्रहित प्रक्रिया है जिसे सहेजने की स्थिति सेट करने की आवश्यकता है ताकि कुछ परिस्थितियों में, यह सबकुछ पूर्ववत कर सके और कॉलर को त्रुटि कोड वापस कर सके , या इसे स्वीकार/प्रतिबद्ध करें और कॉलर को सफलता वापस कर दें। लेकिन मुझे यह काम करने की ज़रूरत है कि क्या कॉलर पहले ही लेनदेन शुरू कर चुका है या नहीं। डॉक्टर इस विषय पर बेहद उलझन में है। यहां मुझे लगता है कि काम करेगा, लेकिन मैं सभी विधियों में से कुछ निश्चित नहीं हूं।ट्रांसफर बनाम BEGIN ट्रांसएक्शन (एसक्यूएल सर्वर) लेनदेन को अच्छी तरह से घोंसला कैसे करें
बात यह है - यह Stored Procedure (SP)
दूसरों द्वारा बुलाया जाता है। इसलिए मुझे नहीं पता कि उन्होंने लेनदेन शुरू किया है या नहीं ... भले ही मुझे उपयोगकर्ताओं को मेरे एसपी का उपयोग करने के लिए लेनदेन शुरू करने की आवश्यकता हो, फिर भी मुझे Save Points
के उचित उपयोग के बारे में प्रश्न हैं ...
मेरा यदि कोई लेनदेन प्रगति पर है, तो एसपी जांच करेगा, और यदि नहीं, तो BEGIN TRANSACTION
के साथ एक शुरू करें। यदि कोई लेनदेन पहले ही प्रगति पर है, तो यह SAVE TRANSACTION MySavePointName
के साथ एक सेव पॉइंट बना देगा, और इस तथ्य को बचाएगा कि मैंने यही किया है।
फिर अगर मुझे अपने परिवर्तन वापस लेना है, तो मैंने BEGIN TRANSACTION
पहले किया था, तो मैं ROLLBACK TRANSACTION
करूँगा। अगर मैंने सेव पॉइंट किया है, तो मैं ROLLBACK TRANSACTION MySavePointName
करूँगा। यह परिदृश्य महान काम करता प्रतीत होता है।
यहां वह जगह है जहां मुझे थोड़ा उलझन मिलता है - अगर मैं अपना काम पूरा करना चाहता हूं, अगर मैंने लेनदेन शुरू किया है तो मैं COMMIT TRANSACTION
निष्पादित करूंगा। लेकिन अगर मैंने एक सेव प्वाइंट बनाया है? मैं COMMIT TRANSACTION MySavePointName
की कोशिश की है, लेकिन फिर फोन करने वाले अपने लेन-देन करने का प्रयास और एक त्रुटि हो जाता है:
The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.
तो मैं तो सोच रहा हूँ - एक बचाने के बिंदु वापस लुढ़का जा सकता है (कि काम करता है: ROLLBACK TRANSACTION MySavePointName
वापस रोल नहीं होगा फोन करने वाले का लेन-देन)। लेकिन शायद किसी को इसे "प्रतिबद्ध" करने की आवश्यकता नहीं है? यह केवल वहां रहता है, यदि आपको इसे वापस रोल करने की आवश्यकता है, लेकिन मूल लेनदेन किए जाने के बाद (या वापस लुढ़काया गया) दूर हो जाता है?
यदि लेनदेन "घोंसला" करने का "बेहतर" तरीका है, तो कृपया कुछ प्रकाश भी डालें। मुझे पता नहीं चला है कि BEGIN TRANSACTION
के साथ घोंसला कैसे करें, लेकिन केवल रोलबैक या मेरा आंतरिक लेनदेन करें। लगता है कि ROLLBACK
हमेशा शीर्ष लेनदेन पर वापस आ जाएगा, जबकि COMMIT
बस @@trancount
में कमी करता है।
आपका खोज एक जवाब के रूप में पोस्ट के लायक हो सकता है। –
@Andriy ठीक है, मैंने यही किया - मेरे संपादन को हटा दिया और इसके बजाय इसे एक उत्तर के रूप में इस्तेमाल किया। धन्यवाद। –