2008-10-07 10 views
32

शुरू, इस अन्य संग्रहीत प्रक्रिया भी लेन-देन में गिर जाता है?एक संग्रहीत प्रक्रिया निष्पादित अंदर/समाप्ति लेन-देन

मुझे नहीं पता था कि यह सी # में कोशिश/कैच की तरह काम करता है या नहीं।

उत्तर

33

हां, सब कुछ जो आप शुरुआती लेनदेन और कमिट (या रोलबैक) के बीच करते हैं लेनदेन का हिस्सा है।

+5

यह पूरी तरह से सच नहीं है।असल में, तालिका चर पर संचालन लेनदेन के दायरे से बाहर हैं; रोलबैक आपके टेबल वैरिएबल में किए गए किसी भी बदलाव को प्रभावित नहीं करता है। –

+5

ठीक है, मेरा मतलब है कि आप डेटाबेस में * सबकुछ करते हैं * - मुझे लगता है कि मुझे लगता है कि यह स्पष्ट था कि वैरिएबल लेन-देन से प्रभावित नहीं होते हैं - हालांकि मुझे लगता है कि यह स्केलर चर के मुकाबले तालिका चर के साथ थोड़ा कम अंतर्ज्ञानी है। – Blorgbeard

+0

क्या होगा यदि बाहरी ट्रांसलेशन कॉल के अंदर बुलाया गया स्पैम ट्रांज़ेक्शन करता है? आंतरिक लेनदेन वापस आने के बाद आंतरिक लेनदेन रोलबैक कहलाता है? – holaSenor

5

मुझे एमएस एसक्यूएल सर्वर में विश्वास है कि संग्रहीत प्रक्रिया निष्पादन लेनदेन के भीतर होगा, लेकिन इसके साथ बहुत सावधान रहें। यदि आपके पास घोंसले हुए लेनदेन हैं (यानी, संग्रहीत प्रक्रिया के बाहर लेनदेन और संग्रहीत प्रक्रिया के अंदर एक अलग लेनदेन), तो रोलबैक सभी लेनदेन को प्रभावित करेगा, न केवल निकटतम संलग्न लेनदेन।

1

हां, सभी नेस्टेड संग्रहीत प्रक्रिया कॉल लेनदेन के दायरे में शामिल हैं। यदि आप SQL Server 2005 या अधिक का उपयोग कर रहे हैं, तो आप कोशिश कर सकते हैं ... कैच भी करें। Here उस पर अधिक जानकारी है।

11

बहुत अच्छा लगता है, धन्यवाद एक गुच्छा। मैं (क्योंकि मैं 05 पर हूँ)

BEGIN TRY 
     BEGIN TRANSACTION 

     DO SOMETHING 

     COMMIT 
    END TRY 
    BEGIN CATCH 
     IF @@TRANCOUNT > 0 
     ROLLBACK 

     -- Raise an error with the details of the exception 
     DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int 
     SELECT @ErrMsg = ERROR_MESSAGE(), 
      @ErrSeverity = ERROR_SEVERITY() 

     RAISERROR(@ErrMsg, @ErrSeverity, 1) 
    END CATCH 
+0

यह काम करता है! धन्यवाद! Http://stackoverflow.com/questions/2715184/tsql-create-a-stored-proc-inside-a-transaction-statement में केएम द्वारा समाधान की तरह नहीं, जो नेटवर्क से संबंधित त्रुटि फेंकता है – knocte

5

कुछ इस तरह कर रही क्रिस उल्लेख किया है, आप लेन-देन वापस रोलिंग के बारे में सावधान रहना चाहिए समाप्त हो गया।

विशेष रूप से इस:

IF @@TRANCOUNT > 0 ROLLBACK 

आप क्या चाहते हैं हमेशा नहीं है। आप इस

IF(@@TRANCOUNT = 1) ROLLBACK TRAN 
ELSE IF(@@TRANCOUNT > 1) COMMIT TRAN 
RETURN @error 

की तरह कुछ कर सकता है इस तरह, बुला proc संग्रहीत प्रक्रिया से वापसी मान का निरीक्षण किया और निर्धारित करता है, तो यह वैसे भी प्रतिबद्ध या बुलबुला ऊपर त्रुटि के लिए जारी करना चाहता है कर सकते हैं।

कारण यह है कि 'COMMIT' आपके लेनदेन काउंटर को कम करेगा। एक बार जब यह लेनदेन काउंटर शून्य हो जाता है, तो एक वास्तविक प्रतिबद्धता होगी।

1

@ क्रिस, मुझे यह नहीं पता था।

अधिक जानकारी के लिए googling जब मैं this भर गया - आप 'savepoints' सेट कर सकते हैं, जिसे पूरे लेनदेन को वापस घुमाने के बिना वापस घुमाया जा सकता है।

इस स्थिति में उपयोगी हो सकता है।

1

Chris और James का उल्लेख है, आपको नेस्टेड लेनदेन से निपटने के दौरान सावधान रहना होगा। एक सेट SQL Server Centra एल पर Don Peterson द्वारा लिखित लेनदेन के विषय पर एक बहुत अच्छा लेख है, मैं उन लोगों में से एक पढ़ने होने की सिफारिश करेंगे:

यहाँ देखते हैं:

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