मैं एक सी # डेवलपर सीख रहा हूं और अधिक टीएसक्यूएल सीख रहा हूं। मैं इस तरह एक पटकथा लिखी:क्या किसी लेन-देन को पकड़ने की आवश्यकता होती है?
begin transaction
--Insert into several tables
end transaction
लेकिन मुझे बताया गया था कि एक अच्छा विचार नहीं था और कुछ इस तरह उपयोग करने के लिए:
BEGIN TRANSACTION;
BEGIN TRY
-- Generate a constraint violation error.
DELETE FROM Production.Product
WHERE ProductID = 980;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
GO
मैं नहीं दिख रहा है यही कारण है कि दूसरे उदाहरण अधिक सही है । क्या पहला व्यक्ति वही काम नहीं करेगा? ऐसा लगता है कि पहला या तो सभी टेबल अपडेट करेगा, या बिल्कुल नहीं? मुझे नहीं लगता कि प्रतिबद्धता से पहले @@TRANCOUNT
क्यों जांचना आवश्यक है।
मैं वही तर्क दूंगा जो आप हैं। इसके अतिरिक्त आपके लिए अनुशंसित प्रयास/पकड़ पैटर्न एक विरोधी पैटर्न है जिसे मैं कोशिश/स्क्वाच कहता हूं। यह कैप्चर और त्रुटि करता है और फिर चुपचाप कमाता है। यह त्रुटियों को संभालने में नहीं है, यह उन्हें दबा रहा है। ऐसा कहा जा रहा है कि एक लेनदेन के लिए एक कोशिश/पकड़ ब्लॉक की आवश्यकता नहीं है। विशेष रूप से यदि आप एक ट्रिगर में हैं, तो कोशिश/पकड़ का उपयोग करने से संभवतः इससे कहीं अधिक समस्याएं हल हो जाएंगी। –
यदि दूसरे उदाहरण में कुछ भी है, तो प्रयास प्रयास ब्लॉक में होना चाहिए, पकड़ने के बाद नहीं ... मुझे लगता है कि – Kritner