2010-04-12 12 views
36

कहें कि मेरे पास एक अलग प्रक्रिया है, जिसमें कई अलग-अलग चयन, इन्सर्ट, अपडेट और डिलीट स्टेटमेंट शामिल हैं। कोई स्पष्ट BEGIN ट्रान्स/COMMIT ट्रान्स/रोलबैक ट्रान्स तर्क नहीं है।एसक्यूएल सर्वर लेनदेन के संबंध में संग्रहीत प्रक्रियाओं के अंदर बयान का इलाज कैसे करता है?

एसक्यूएल सर्वर इस संग्रहीत प्रक्रिया लेन-देन को कैसे प्रबंधित करेगा? क्या प्रत्येक कथन के लिए एक अंतर्निहित कनेक्शन होगा? या संग्रहीत प्रक्रिया के लिए एक लेनदेन होगा?

इसके अलावा, मैं टी-एसक्यूएल और/या एसक्यूएल सर्वर प्रबंधन स्टूडियो का उपयोग करके इसे अपने आप कैसे प्राप्त कर सकता हूं?

धन्यवाद!

उत्तर

29

केवल एक कनेक्शन होगा, प्रक्रिया को चलाने के लिए इसका उपयोग किया जाता है, इससे कोई फर्क नहीं पड़ता कि संग्रहित प्रक्रिया में कितने SQL कमांड हैं।

क्योंकि आपके पास संग्रहीत प्रक्रिया में कोई स्पष्ट BEGIN ट्रांज़ेक्शन नहीं है, इसलिए प्रत्येक कथन किसी भी त्रुटि के दौरान किसी भी बदलाव को रोलबैक करने की कोई क्षमता नहीं रखेगा।

हालांकि, अगर आप संग्रहीत प्रक्रिया को कॉल करने से पहले एक BEGIN ट्रांज़ेक्शन जारी करते हैं, तो सभी कथन लेनदेन के भीतर समूहीकृत होते हैं और संग्रहीत प्रक्रिया निष्पादन के बाद या तो COMMITted या रोलबैक किया जा सकता है।

संग्रहीत प्रक्रिया के भीतर से, आप यह निर्धारित कर सकते हैं कि आप सिस्टम चर @@TRANCOUNT (Transact-SQL) के मान की जांच करके लेनदेन के भीतर चल रहे हैं या नहीं। शून्य का मतलब है कि कोई लेनदेन नहीं है, और कुछ भी दिखाता है कि आप कितने घोंसला वाले लेनदेन में हैं। आपके एसक्यूएल सर्वर संस्करण के आधार पर आप XACT_STATE (Transact-SQL) का भी उपयोग कर सकते हैं।

आप निम्नलिखित करते हैं: प्रक्रिया के भीतर

BEGIN TRANSACTION 

EXEC my_stored_procedure_with_5_statements_inside @Parma1 

COMMIT 

सब कुछ लेन-देन से आच्छादित है, सभी 6 बयान (EXEC एक बयान लेन-देन के अंतर्गत आने वाले है, 1 + 5 = 6)। आप ऐसा करते हैं:

BEGIN TRANSACTION 

EXEC my_stored_procedure_with_5_statements_inside @Parma1 
EXEC my_stored_procedure_with_5_statements_inside @Parma1 

COMMIT 

दो प्रक्रिया कॉल के अंतर्गत सब कुछ लेन-देन के अंतर्गत आते हैं, सभी 12 बयान (2 अधिकारियों दोनों बयान लेन-देन, 1 + 5 + 1 + 5 = 12 के अंतर्गत आने वाले हैं)।

+0

तो आप कहते हैं कि असल में, संग्रहीत प्रक्रिया के भीतर प्रत्येक कथन अपना लेनदेन बनाता है, यानी पांच लेनदेन में एक संग्रहीत प्रक्रिया को पांच लेनदेन में निष्पादित किया जाता है? – Sleepless

+0

यदि प्रक्रिया में या प्रक्रिया को लपेटने के बाहर कोई लेनदेन नहीं है, तो प्रक्रिया में प्रत्येक कथन काम की एक स्वायत्त इकाई है। वास्तव में लेनदेन नहीं है, क्योंकि आप फिर से प्रतिबद्ध या रोल नहीं कर सकते हैं। यदि आप एक लेनदेन में एक प्रक्रिया कॉल लपेटते हैं, तो प्रक्रिया में सब कुछ उस लेनदेन के भीतर निष्पादित किया जाता है। –

+0

धन्यवाद! बीटीडब्ल्यू, आप कोड कोड स्वरूपण कैसे करते हैं मैं स्पष्ट रूप से विफल रहा? – Sleepless

1

आप एक छोटी सी संग्रहित प्रक्रिया बनाकर अपने आप को खोज सकते हैं जो कुछ सरल करता है, एक टेस्ट टेबल में रिकॉर्ड डालें। फिर ट्रैन शुरू करें; sp_test चलाएं; रोलबैक; क्या नया रिकॉर्ड है? यदि ऐसा है, तो एसपी बाहरी लेनदेन को अनदेखा करता है। यदि नहीं, तो एसपी लेनदेन के अंदर निष्पादित एक और कथन है (जो मुझे यकीन है कि यह मामला है)।

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