2011-01-06 4 views
6

यदि मेरे पास एक संग्रहित प्रक्रिया है जो विभिन्न तर्कों के साथ कई बार संग्रहीत प्रक्रिया निष्पादित करती है, तो क्या इनमें से प्रत्येक कॉल स्वतंत्र रूप से दूसरों के लिए प्रतिबद्ध है?मैं कैसे सुनिश्चित कर सकता हूं कि नेस्टेड लेन-देन एक-दूसरे से स्वतंत्र रूप से किए जाते हैं?

दूसरे शब्दों में, यदि नेस्टेड प्रक्रिया के पहले दो निष्पादन सफल होते हैं, लेकिन तीसरा विफल रहता है, तो क्या पहले दो निष्पादन (और उन्हें वापस रोल नहीं) के परिणामों को संरक्षित करना संभव है?

मैं इस तरह एक संग्रहीत प्रक्रिया परिभाषित कुछ एसक्यूएल सर्वर 2000 में है: यहाँ खेद पुन: पेश करने

CREATE PROCEDURE toplevel_proc .. 
AS 
BEGIN 

     ... 

     while @row_count <= @max_rows 
    begin 
     select @parameter ... where rownum = @row_count 
     exec nested_proc @parameter 
     select @row_count = @row_count + 1 
    end 

END 

उत्तर

6

पहले, there is no such thing as a nested transaction in SQL Server

लेकिन, आप के रूप में इस उदाहरण प्रति (बहुत लंबा SAVEPOINTs उपयोग कर सकते हैं) साथी एसओ उपयोगकर्ता Remus Rusanu

संपादित करें: एलेक्सकुज़नेत्सोव ने उल्लेख किया (उन्होंने हालांकि अपना जवाब हटा दिया) कि यह लेनदेन खत्म होने पर काम नहीं करेगा। यह SET XACT_ABORT चालू या कुछ ट्रिगर त्रुटियों के साथ हो सकता है।

3

बोल से:

ROLLBACK एक savepoint_name या transaction_name वापस लेन-देन की शुरुआत करने के लिए रोल के बिना लेन-देन। लेन-देन घोंसला करते समय, यह वही कथन सभी आंतरिक लेन-देन को पर सबसे पुराना BEGIN ट्रांज़ेक्शन कथन देता है।

पता है कि एसक्यूएल सर्वर लेनदेन वास्तव में जिस तरह से आप सोच सकते में नहीं लगाए गए हैं रहें:

मैं भी एक और धागा here से निम्नलिखित पाया। एक बार एक स्पष्टीकरण लेनदेन शुरू हो गया है, बाद में BEGIN TRAN वृद्धि @@ TRANCOUNT जबकि COMMIT मान कम करता है। संपूर्ण आउटपुट लेनदेन है जब एक COMMIT परिणाम शून्य @@ TRANCOUNT में होता है। लेकिन एक रोल्बैक बिना सहेजने के सभी बाहरी कार्य को पीछे छोड़ देता है जिसमें बाहरी लेनदेन शामिल है।

आप नेस्टेड लेनदेन व्यवहार की जरूरत है, तो आप के बजाय बचाने लेन-देन का उपयोग TRAN और उपयोग ROLLBACK TRAN [savepoint_name] ROLLBACK के बजाय TRAN शुरू करने की आवश्यकता होगी।

तो यह संभव दिखाई देगा।

+1

"रोलबैक ट्रैन के बजाय रोलबैक ट्रैन का उपयोग करें" ?? – Greg

+0

@ ग्रेग - इसे इंगित करने के लिए धन्यवाद। मैंने उद्धृत पाठ को 'savepoint_name' टेक्स्ट के आस-पास कोण ब्रैकेट का उपयोग किया और इससे एसओ मार्कअप इंजन को टेक्स्ट छिपाने का कारण बन गया। स्क्वायर ब्रैकेट का उपयोग करने के लिए टेक्स्ट संपादित किया है। – Tony

+0

इसे ठीक करने के लिए धन्यवाद! – Greg

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

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