जैसा कि निक और मार्टिन द्वारा उल्लेख किया गया है, आपकी क्वेरी की अंतिम स्थिति इस बात पर निर्भर करती है कि क्वेरी पूरा होने से पहले SQL सर्वर आपके नेटवर्क केबल पुल के बारे में जानता है या नहीं। ऑनलाइन पुस्तकों से (हालांकि मुझे यह दिलचस्प लगता है कि 2000 , 2005 , 2008 और 2008 R2 में इसके लिए समतुल्य विषय हैं , लेकिन 2012 या 2014 नहीं):
यदि कोई त्रुटि लेन-देन के सफल समापन को रोकती है, तो SQL सर्वर स्वचालित रूप से लेन-देन को वापस ले लेता है और लेनदेन द्वारा रखे गए सभी संसाधनों को मुक्त कर देता है। यदि डेटाबेस इंजन के एक उदाहरण के लिए क्लाइंट का नेटवर्क कनेक्शन टूट गया है, तो कनेक्शन के लिए कोई भी बकाया लेनदेन वापस लुढ़का हुआ है जब नेटवर्क ब्रेक के उदाहरण को सूचित करता है। यदि क्लाइंट एप्लिकेशन विफल हो जाता है या क्लाइंट कंप्यूटर नीचे चला जाता है या फिर से चालू हो जाता है, तो यह कनेक्शन को भी तोड़ देता है, और डेटाबेस इंजन का उदाहरण किसी भी बकाया कनेक्शन को तब वापस करता है जब नेटवर्क इसे तोड़ने की सूचना देता है। यदि क्लाइंट एप्लिकेशन से लॉग इन करता है, तो कोई भी बकाया लेनदेन वापस लुढ़क जाता है।
(एक तरफ के रूप में, दूसरे अंतिम वाक्य में शब्द कनेक्शन शायद लेन-देन होने के लिए था । मुझे नहीं पता कि कोई कनेक्शन वापस कैसे लेता है।)
इसी तरह से, SQL सर्वर अनपेक्षित रूप से बंद होने के बाद रिकवरी के दौरान लेनदेन को पूर्ववत या फिर से कर सकता है, और यह शटडाउन के समय लेनदेन की स्थिति पर निर्भर करेगा। मैंने देखा है कि लोग इस रणनीति का उपयोग करने के लिए प्राप्त कर रहे हैं कि आप क्या करने की कोशिश कर रहे थे (लेनदेन को रद्द करें) और जब सर्वर ने फिर से काम शुरू किया तो बस फिर से किया गया था (इसलिए उनके घुटने-झटका की प्रतिक्रिया का शुद्ध प्रभाव बहुत करीब था शून्य से वे अपेक्षित)।
तो इस के अधीन होने के बजाय, एक घबराहट में कठोर चीजें करने के बजाय, जैसे कि एक नेटवर्क केबल या मशीन को बंद करना, मैं सुझाव देता हूं कि भविष्य में आपके पास महत्वपूर्ण प्रणालियों के खिलाफ तदर्थ प्रश्नों को चलाने के बारे में बेहतर अनुशासन है। उदाहरण के लिए, इसके बजाय:
UPDATE dbo.sometable
-- where *oops* I forgot this part
ये लो:
BEGIN TRANSACTION;
UPDATE dbo.sometable
-- where *oops* I forgot this part
-- COMMIT TRANSACTION;
-- ROLLBACK TRANSACTION;
फिर, यदि अपडेट वास्तव में सही था, तो आप COMMIT
भाग को हाइलाइट कर सकते हैं और इसे चला सकते हैं। यदि ऐसा नहीं था, तो आप शांति से उस ROLLBACK
हिस्से को उजागर कर सकते हैं और उसे चला सकते हैं। आप उस बॉयलरप्लेट को शामिल करने के लिए अपने टेम्पलेट को संपादित करने के लिए SSMS टूल पैक जैसे ऐड-इन्स का भी उपयोग कर सकते हैं New Query
।
अब यह उस स्थिति में भी आपको परेशानी में डाल सकता है जब आप क्वेरी चलाते हैं और फिर या तो कमिट या रोलबैक नहीं करते हैं , क्योंकि अब आपका लेनदेन आपके उपयोगकर्ताओं को रोक रहा है। लेकिन यह बेहतर है तो अपरिवर्तनीय रूप से डेटा को संशोधित करना।
और निश्चित रूप से, हमेशा की तरह, एक बैकअप है जिस पर आप भरोसा कर सकते हैं।