2012-12-21 23 views
17

कभी-कभी मैंने निम्न कोड स्निपेट देखा। begin try के साथ आवश्यक कब है? वो दोनों? या यह जांच से पहले रोलबैक होने पर हमेशा इसे सुरक्षित रखने के लिए एक सुरक्षित तरीका (सर्वोत्तम अभ्यास) है?जब पकड़ने की कोशिश में @@ trancount> 0 जांचना आवश्यक है?

begin tran 
begin try 
    ... just several lines of sql ... 
    if @@trancount > 0 commit tran 
end try 
begin catch 
    if @@trancount > 0 rollback tran 
end catch 

उत्तर

8
जब @@trancount के साथ काम कर

मैं कुछ परिदृश्यों के बारे में सोच सकते हैं पर विचार करने के:

  1. वर्तमान लेन-देन एक और संग्रहीत प्रक्रिया है जो था अपने स्वयं के लेन-देन
  2. वर्तमान लेन-देन बुलाया गया था से बुलाया गया था कुछ .NET कोड द्वारा अपने लेनदेन
  3. वर्तमान लेनदेन एकमात्र लेनदेन है

मुझे विश्वास है कि रीमस Rusanu की Exception handling and nested transactions इन सभी संभावनाओं को संभालती है।

+0

उदाहरण लगता है नेस्टेड लेनदेन से बचने का प्रयास करें। क्या ये ज़रूरी हैं? – ca9163d9

+0

मेरे लिए, विचार यह है कि यदि यह नई कार्रवाई एक नेस्टेड लेनदेन है, तो इसे सहेजें। यदि कोई त्रुटि है और यदि यह घोंसला वाला लेनदेन है, तो केवल नेस्टेड लेनदेन को रोलबैक करें ताकि मूल कॉलर को प्रभावित न किया जा सके। – 8kb

+0

4: जब आप कुछ कचरा एन्क्रिप्टेड एपीआई एसपी बुला रहे हैं जो अपने लेनदेन को रोलबैक नहीं करता है तो यह तय करता है कि कोई समस्या है ... –