जवाबों:
जब तक आप नहीं है के रूप में COMMIT या ROLLBACK एक सौदे, यह अभी भी "चल" है और संभावित रूप से ताले पकड़े।
यदि आपका क्लाइंट (एप्लिकेशन या उपयोगकर्ता) कमिट करने से पहले डेटाबेस से कनेक्शन बंद कर देता है, तो भी चलने वाले किसी भी लेनदेन को वापस ले लिया जाएगा और समाप्त कर दिया जाएगा।
आप वास्तव में इसे स्वयं आज़मा सकते हैं, इससे आपको यह महसूस करने में मदद मिलेगी कि यह कैसे काम करता है।
प्रबंधन स्टूडियो में एक दो खिड़कियां (टैब) खोलें, उनमें से प्रत्येक के पास sql का अपना कनेक्शन होगा।
अब आप एक विंडो में लेन-देन शुरू कर सकते हैं, कुछ सामान डाल सकते हैं जैसे इन्सर्ट / अपडेट / डिलीट, लेकिन अभी तक कमिट नहीं किया गया है। फिर दूसरी विंडो में आप देख सकते हैं कि लेनदेन के बाहर डेटाबेस कैसा दिखता है। अलगाव स्तर के आधार पर, तालिका को तब तक लॉक किया जा सकता है जब तक कि पहली खिड़की प्रतिबद्ध न हो, या आप देख सकते हैं (नहीं) कि अन्य लेनदेन ने अब तक क्या किया है, आदि।
अलग-थलग स्तरों के साथ खेलते हैं और कोई भी संकेत नहीं देते हैं कि वे परिणामों को कैसे प्रभावित करते हैं।
यह भी देखें कि जब आप लेनदेन में कोई त्रुटि करते हैं तो क्या होता है।
यह समझना बहुत महत्वपूर्ण है कि यह सारा सामान कैसे काम करता है या आप क्या करते हैं, कई बार एसक्यूएल करता है।
मज़े करो! जी जे।
लेन-देन पूरी तरह से या बिल्कुल नहीं चलाने का इरादा है। लेन-देन पूरा करने का एकमात्र तरीका प्रतिबद्ध है, किसी भी अन्य तरीके से रोलबैक होगा।
इसलिए, यदि आप शुरू करते हैं और फिर प्रतिबद्ध नहीं होते हैं, तो इसे वापस कनेक्शन के करीब ले जाया जाएगा (चूंकि लेनदेन पूर्ण रूप से चिह्नित किए बिना बंद हो गया था)।
इनकम लेनदेन के अलगाव स्तर पर निर्भर करता है।
जब आप लेन-देन खोलते हैं तो कुछ भी अपने आप बंद नहीं हो जाता है। लेकिन अगर आप उस लेन-देन के अंदर कुछ प्रश्नों को निष्पादित करते हैं, तो अलगाव स्तर के आधार पर, कुछ पंक्तियाँ, टेबल या पृष्ठ लॉक हो जाते हैं, इसलिए यह अन्य प्रश्नों को प्रभावित करेगा जो उन्हें अन्य लेनदेन से एक्सेस करने का प्रयास करते हैं।
लेन-देन के लिए उदाहरण
ट्रान टीटी शुरू करें
आपके एसक्यूएल बयान
अगर त्रुटि हुई तो रोलबैक ट्रॅन टीटी बाकी कमिट टीटीटी
जब तक आपने कमिट tt निष्पादित नहीं किया है, तब तक डेटा नहीं बदला जाएगा
BEGIN TRAN X ... BEGIN TRAN Y ... ROLLBACK Y
उदाहरण के लिए, काम नहीं करता है। देखें stackoverflow.com/questions/1273376/...
संभावित लॉकिंग समस्याओं के अलावा, आप यह भी पा सकते हैं कि आपके लेन-देन लॉग बढ़ने लगते हैं क्योंकि वे सक्रिय लेन-देन के लिए न्यूनतम एलएसएन से पहले नहीं काटे जा सकते हैं और यदि आप स्नैपशॉट अलगाव का उपयोग कर रहे हैं तो टेम्पर्डबेड में आपके संस्करण की दुकान बढ़ेगी इसी तरह के कारण।
आप उपयोग कर सकते हैं dbcc opentran
सबसे पुराने खुले लेनदेन का विवरण देखने के लिए ।
व्यवहार परिभाषित नहीं है, इसलिए आपको स्पष्ट रूप से कमिट या रोलबैक सेट करना होगा:
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 उपयोगकर्ता]