दिलचस्प पोस्ट
मावेन अमान्य LOC शीर्षलेख (खराब हस्ताक्षर) विभिन्न मूल्यों पर सेल रंग बदलें – ग्रिडव्यू एमवीवीएम की बुनियादी अवधारणाएं – एक व्यूमोल्ड क्या करना चाहिए? NSArray पर सबस्क्रिप्ट का उपयोग करते समय कम्पाइलर त्रुटि "अपेक्षित पद्धति नहीं मिली" समय बीतने के लिए कैसे? मैं PHP में HTML को गूंज कैसे कर सकता हूं? एएसपी.Net में SQL इंजेक्शन की रोकथाम अजगर (पांडा) के साथ खड़ी सलाखों के क्लस्टर कैसे हैं पायथन के अंदर "पीआईपी स्थापित" क्यों एक सिंटेक्स एरर उठाती है? तपन तत्व का पृष्ठभूमि का रंग मैं XmlSerializer का उपयोग कर आंतरिक कक्षाओं को कैसे सीरियल कर सकता हूँ? स्टोरीबोर्ड से UIView दृश्य से परे का विस्तार करने वाली एक UIScrollView में वस्तुओं को कैसे जोड़ें? सत्र चर PHP काम नहीं कर रहा है आप jQuery के डिफरेड्स की एक सरणी के साथ कैसे काम करते हैं? atoi () – int के लिए स्ट्रिंग

SQL सर्वर – लेनदेन त्रुटि पर वापस रोल?

हमारे पास क्लाइंट एप्लिकेशन है जो SQL सर्वर 2005 पर कुछ एसक्यूएल चल रहा है जैसे कि निम्न:

BEGIN TRAN; INSERT INTO myTable (myColumns ...) VALUES (myValues ...); INSERT INTO myTable (myColumns ...) VALUES (myValues ...); INSERT INTO myTable (myColumns ...) VALUES (myValues ...); COMMIT TRAN; 

इसे एक लंबी स्ट्रिंग कमान द्वारा भेजा जाता है।

यदि कोई सम्मिलन विफल हो जाता है, या कमांड के किसी भी भाग में विफल रहता है, तो क्या SQL सर्वर लेनदेन वापस रोल करता है? यदि वह रोलबैक नहीं करता है, तो क्या मुझे इसे वापस रोल करने के लिए दूसरी कमान भेजना है?

मैं एपीआई और भाषा का उपयोग कर रहा हूँ, लेकिन मैं समझ सकता हूँ कि SQL सर्वर को किसी भी भाषा के लिए इसका जवाब देना चाहिए।

Solutions Collecting From Web of "SQL सर्वर – लेनदेन त्रुटि पर वापस रोल?"

त्रुटि के मामले में आप यह सुनिश्चित करने के लिए कि आप एसक्यूएल रोल को स्वचालित रूप से वापस रोल करने के लिए अपने लेनदेन से पहले set xact_abort on कर सकते हैं।

आप सही हैं कि पूरे लेनदेन को वापस लाया जाएगा। आपको उसे वापस रोल करने के लिए आदेश जारी करना चाहिए।

आप TRY CATCH ब्लॉक में इस रूप में लपेट सकते हैं

 BEGIN TRY BEGIN TRANSACTION INSERT INTO myTable (myColumns ...) VALUES (myValues ...); INSERT INTO myTable (myColumns ...) VALUES (myValues ...); INSERT INTO myTable (myColumns ...) VALUES (myValues ...); COMMIT TRAN -- Transaction Success! END TRY BEGIN CATCH IF @@TRANCOUNT > 0 ROLLBACK TRAN --RollBack in case of Error -- you can Raise ERROR with RAISEERROR() Statement including the details of the exception RAISERROR(ERROR_MESSAGE(), ERROR_SEVERITY(), 1) END CATCH 

एमडीएसएन लेख से, लेनदेन (डाटाबेस इंजिन) नियंत्रित करना

यदि बैच में एक रन-टाइम बयान त्रुटि (जैसे बाधा का उल्लंघन) होता है, तो डेटाबेस इंजिन में डिफ़ॉल्ट व्यवहार केवल त्रुटि को उत्पन्न करने वाले कथन को वापस रोल करना है। आप SET XACT_ABORT कथन का उपयोग करके इस व्यवहार को बदल सकते हैं। SET XACT_ABORT चालू होने के बाद, किसी भी समय-समय बयान त्रुटि वर्तमान लेनदेन की एक स्वचालित रोलबैक का कारण बनती है। त्रुटियों को संकलित करें, जैसे वाक्यविन्यास त्रुटियां, एसईटी XACT_ABORT द्वारा प्रभावित नहीं हैं अधिक जानकारी के लिए, SET XACT_ABORT (Transact-SQL) देखें।

आपके मामले में यह सम्पूर्ण लेन-देन रोलबैक करेगा जब कोई सम्मिलित विफल हो जाएगा।

यदि सम्मिलित करता है में से कोई एक विफल या आदेश का कोई भी हिस्सा विफल रहता है, तो क्या SQL सर्वर लेनदेन वापस रोल करता है?

नहीं, यह नहीं है।

यदि वह रोलबैक नहीं करता है, तो क्या मुझे इसे वापस रोल करने के लिए दूसरी कमान भेजना है?

निश्चित, आपको ROLLBACK बजाय ROLLBACK जारी करना चाहिए

यदि आप यह तय करना चाहते हैं कि लेनदेन को वापस करने या रोलबैक करना है, तो आपको COMMIT सजा को निकाल देना चाहिए, सम्मिलन के परिणामों की जांच करें और चेक के परिणामों के आधार पर COMMIT या ROLLBACK जारी करें।

यहां MSSQL सर्वर 2016 के साथ त्रुटि संदेश प्राप्त करने के साथ कोड:

 BEGIN TRY BEGIN TRANSACTION -- Do your stuff that might fail here COMMIT END TRY BEGIN CATCH IF @@TRANCOUNT > 0 ROLLBACK TRAN DECLARE @ErrorMessage NVARCHAR(4000) = ERROR_MESSAGE() DECLARE @ErrorSeverity INT = ERROR_SEVERITY() DECLARE @ErrorState INT = ERROR_STATE() -- Use RAISERROR inside the CATCH block to return error -- information about the original error that caused -- execution to jump to the CATCH block. RAISERROR (@ErrorMessage, -- Message text. @ErrorSeverity, -- Severity. @ErrorState -- State. ); END CATCH