यदि आप किसी डेटाबेस (जैसे SQL सर्वर) से लेन-देन नहीं करते हैं, तो क्या होता है?


108

मान लीजिए कि मेरे पास एक प्रश्न है:

begin tran
-- some other sql code

और फिर मैं कमिट करना या वापस रोल करना भूल जाता हूं।

यदि कोई अन्य ग्राहक किसी क्वेरी को निष्पादित करने का प्रयास करता है, तो क्या होगा?

जवाबों:


148

जब तक आप नहीं है के रूप में COMMIT या ROLLBACK एक सौदे, यह अभी भी "चल" है और संभावित रूप से ताले पकड़े।

यदि आपका क्लाइंट (एप्लिकेशन या उपयोगकर्ता) कमिट करने से पहले डेटाबेस से कनेक्शन बंद कर देता है, तो भी चलने वाले किसी भी लेनदेन को वापस ले लिया जाएगा और समाप्त कर दिया जाएगा।


1
एमएमएम, ठीक है मैं यह पता लगाता हूं कि यह किसी प्रकार का ताला बना रहा था। मुझे यकीन नहीं था कि कनेक्शन बंद करना वास्तव में मुझे इस राज्य से बाहर कर देगा। समस्या यह थी कि जब मैं प्रतिबद्ध करने की कोशिश कर रहा था तो मुझे एक त्रुटि मिल रही थी। अब मैंने कनेक्शन बंद कर दिया और यह सब काम कर गया।
चारबेल

12
साइड नोट: यदि प्रबंधन स्टूडियो का उपयोग कर रहे हैं, तो क्वेरी विंडो बंद करने से कनेक्शन बंद हो जाएगा
जो फिलिप्स

3
@BradleyDotNET: हाँ, निश्चित रूप से
marc_s

2
ध्यान रखें कि यदि आप क्वेरी विंडो / कनेक्शन को डिफ़ॉल्ट रूप से बंद करते हैं, तो SQL सर्वर प्रबंधन स्टूडियो ऑटो चालू हो जाता है।
नूनो

1
ध्यान दें कि जब लेन-देन सक्रिय होने के दौरान क्लाइंट कनेक्शन बंद कर देता है, तो इसे हमेशा वापस नहीं घुमाया जाता है - यह क्लाइंट और डीबी पर निर्भर करता है। उदाहरण के लिए, जब एक जावा ऐप ओरेकल डीबी से एक कनेक्शन बंद कर देता है, तो कोई भी खुला कनेक्शन स्वचालित रूप से प्रतिबद्ध होता है।
शौकीन चावला

38

आप वास्तव में इसे स्वयं आज़मा सकते हैं, इससे आपको यह महसूस करने में मदद मिलेगी कि यह कैसे काम करता है।

प्रबंधन स्टूडियो में एक दो खिड़कियां (टैब) खोलें, उनमें से प्रत्येक के पास sql का अपना कनेक्शन होगा।

अब आप एक विंडो में लेन-देन शुरू कर सकते हैं, कुछ सामान डाल सकते हैं जैसे इन्सर्ट / अपडेट / डिलीट, लेकिन अभी तक कमिट नहीं किया गया है। फिर दूसरी विंडो में आप देख सकते हैं कि लेनदेन के बाहर डेटाबेस कैसा दिखता है। अलगाव स्तर के आधार पर, तालिका को तब तक लॉक किया जा सकता है जब तक कि पहली खिड़की प्रतिबद्ध न हो, या आप देख सकते हैं (नहीं) कि अन्य लेनदेन ने अब तक क्या किया है, आदि।

अलग-थलग स्तरों के साथ खेलते हैं और कोई भी संकेत नहीं देते हैं कि वे परिणामों को कैसे प्रभावित करते हैं।

यह भी देखें कि जब आप लेनदेन में कोई त्रुटि करते हैं तो क्या होता है।

यह समझना बहुत महत्वपूर्ण है कि यह सारा सामान कैसे काम करता है या आप क्या करते हैं, कई बार एसक्यूएल करता है।

मज़े करो! जी जे।


ठीक है लेकिन क्या कमिटमेंट जारी करने से पहले लेन-देन बहुत कम से कम लॉग इन करने के लिए लिखा जाएगा? उदाहरण के लिए, मान लें कि मैं कमिटमेंट कमांड को शुरू करना चाहता हूं और कमिट करने से पहले "कुछ और करता हूं"। क्या मेरा इन्सर्ट कमांड लॉग करने के लिए लिखा जाएगा? इस तरह से अगर सर्वर कमिट करने से पहले क्रैश हो जाता है..यह वापस आ सकता है जहां यह था और मैं बाद में कमिट कर सकता हूं (जब भी मैं "कुछ और कर रहा हूं")।
user1870400

16

लेन-देन पूरी तरह से या बिल्कुल नहीं चलाने का इरादा है। लेन-देन पूरा करने का एकमात्र तरीका प्रतिबद्ध है, किसी भी अन्य तरीके से रोलबैक होगा।

इसलिए, यदि आप शुरू करते हैं और फिर प्रतिबद्ध नहीं होते हैं, तो इसे वापस कनेक्शन के करीब ले जाया जाएगा (चूंकि लेनदेन पूर्ण रूप से चिह्नित किए बिना बंद हो गया था)।


यह कैसे होना चाहिए, लेकिन यह हमेशा मामला नहीं है।
FalcoGer

... जैसे कि MySQL का MyISAM, जो लेनदेन का समर्थन नहीं करता है, निश्चित रूप से।
पिस्कवर ने बिल्डिंग

3

इनकम लेनदेन के अलगाव स्तर पर निर्भर करता है।

Sql लेनदेन अलगाव समझाया


6
लेनदेन का व्यवहार अलगाव स्तर पर निर्भर नहीं करता है। ताले के कारण वे कर सकते हैं।
marc_s

मुझे पूरा यकीन है कि एक कनेक्शन द्वारा पढ़ा जा सकने वाला डेटा निश्चित रूप से अलगाव स्तर पर निर्भर है। यदि आपके पास READ UNCOMMITTED को अलग-थलग करने के लिए सेट है, तो आप अभी तक किए गए डेटा को पढ़ नहीं सकते हैं और वास्तव में किसी बिंदु पर वापस ट्रैक पर ले जाया जा सकता है, लेकिन यह सुनिश्चित करता है कि कोई लॉकिंग नहीं है। यदि आपने अपने अलगाव स्तर के रूप में पढ़ लिया है, तो आप बिना पढ़े पंक्तियों को नहीं पढ़ सकते हैं - दूसरा क्लाइंट तब तक लटका रहेगा जब तक आप स्नैपशॉट का उपयोग नहीं करते।
Xhalent

2

जब आप लेन-देन खोलते हैं तो कुछ भी अपने आप बंद नहीं हो जाता है। लेकिन अगर आप उस लेन-देन के अंदर कुछ प्रश्नों को निष्पादित करते हैं, तो अलगाव स्तर के आधार पर, कुछ पंक्तियाँ, टेबल या पृष्ठ लॉक हो जाते हैं, इसलिए यह अन्य प्रश्नों को प्रभावित करेगा जो उन्हें अन्य लेनदेन से एक्सेस करने का प्रयास करते हैं।


1

लेन-देन के लिए उदाहरण

ट्रान टीटी शुरू करें

आपके एसक्यूएल बयान

अगर त्रुटि हुई तो रोलबैक ट्रॅन टीटी बाकी कमिट टीटीटी

जब तक आपने कमिट tt निष्पादित नहीं किया है, तब तक डेटा नहीं बदला जाएगा


1
ध्यान दें कि नामकरण लेनदेन केवल एमएस एसक्यूएल में अनावश्यक नहीं है, यह नियंत्रण की झूठी भावना दे सकता है। BEGIN TRAN X ... BEGIN TRAN Y ... ROLLBACK Yउदाहरण के लिए, काम नहीं करता है। देखें stackoverflow.com/questions/1273376/...

0

संभावित लॉकिंग समस्याओं के अलावा, आप यह भी पा सकते हैं कि आपके लेन-देन लॉग बढ़ने लगते हैं क्योंकि वे सक्रिय लेन-देन के लिए न्यूनतम एलएसएन से पहले नहीं काटे जा सकते हैं और यदि आप स्नैपशॉट अलगाव का उपयोग कर रहे हैं तो टेम्पर्डबेड में आपके संस्करण की दुकान बढ़ेगी इसी तरह के कारण।

आप उपयोग कर सकते हैं dbcc opentran सबसे पुराने खुले लेनदेन का विवरण देखने के लिए ।


0

कोई भी अपूर्ण लेन-देन सर्वर को बंद कर देगा और अन्य क्वेरीज़ सर्वर पर निष्पादित नहीं होंगी। आपको या तो लेन-देन को रोलबैक करना होगा या इसे कमिट करना होगा। SSMS को बंद करने से लेन-देन भी समाप्त हो जाएगा जो अन्य प्रश्नों को निष्पादित करने की अनुमति देगा।


-4

व्यवहार परिभाषित नहीं है, इसलिए आपको स्पष्ट रूप से कमिट या रोलबैक सेट करना होगा:

http://docs.oracle.com/cd/B10500_01/java.920/a96654/basic.htm#1003303

"यदि स्वतः-प्रतिबद्ध मोड अक्षम है और आप अपने अंतिम परिवर्तनों को स्पष्ट रूप से कमिट या रोल किए बिना कनेक्शन बंद कर देते हैं, तो एक अंतर्निहित COMMIT ऑपरेशन निष्पादित किया जाता है।"

Hsqldb एक रोलबैक बनाता है

con.setAutoCommit(false);
stmt.executeUpdate("insert into USER values ('" +  insertedUserId + "','Anton','Alaf')");
con.close();

परिणाम है

2011-11-14 14: 20: 22,519 मुख्य INFO [SqlAutoCommitExample: 55] [AutoCommit सक्षम = गलत] 2011-11-14 14: 20: 22,546 मुख्य INFO [SqlAutoCommitExample: 65] [डेटाबेस में # पाया गया 0 उपयोगकर्ता]


2
यह ओरेकल के लिए सच हो सकता है (मेरे पास कोई विचार नहीं है), लेकिन प्रश्नकर्ता एमएस-एसक्यूएल के बारे में पूछ रहा है
पॉल एनजी

पहला उद्धरण JDBC ड्राइवर पर लागू होता है, सर्वर पर नहीं।
djechlin
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.