मैं एक कार्यक्रम पर काम कर रहा हूं जो डीडीएल जारी करता है। मैं जानना चाहूंगा कि क्या CREATE TABLE
इसी तरह के डीडीएल को वापस लाया जा सकता है
- postgres
- माई एसक्यूएल
- SQLite
- और अन्य
बताएं कि प्रत्येक डेटाबेस डीडीएल के साथ लेनदेन को कैसे संभालता है।
मैं एक कार्यक्रम पर काम कर रहा हूं जो डीडीएल जारी करता है। मैं जानना चाहूंगा कि क्या CREATE TABLE
इसी तरह के डीडीएल को वापस लाया जा सकता है
बताएं कि प्रत्येक डेटाबेस डीडीएल के साथ लेनदेन को कैसे संभालता है।
जवाबों:
http://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis PostgreSQL के दृष्टिकोण से इस मुद्दे का अवलोकन प्रदान करता है।
क्या इस दस्तावेज़ के अनुसार डीडीएल लेन-देन है?
SQLite के साथ-साथ ट्रांजेक्शनल DDL भी दिखाई देता है। मैं SQLite में ROLLBACK
एक CREATE TABLE
बयान में सक्षम था । इसके CREATE TABLE
प्रलेखन में किसी विशेष लेन-देन 'गोच' का उल्लेख नहीं है।
PostgreSQL में अधिकांश डेटाबेस ऑब्जेक्ट्स (निश्चित रूप से टेबल, सूचकांक आदि लेकिन डेटाबेस, उपयोगकर्ता नहीं) के लिए ट्रांजेक्शनल डीडीएल है। हालाँकि, व्यावहारिक रूप से किसी भी डीडीएल को ACCESS EXCLUSIVE
लक्ष्य ऑब्जेक्ट पर एक ताला मिलेगा , जो डीडीएल लेनदेन खत्म होने तक पूरी तरह से दुर्गम बना देगा। इसके अलावा, सभी स्थितियों को काफी हद तक नियंत्रित नहीं किया जाता है- उदाहरण के लिए, यदि आप तालिका से चयन करने का प्रयास foo
करते हैं जबकि एक अन्य लेनदेन इसे छोड़ रहा है और एक प्रतिस्थापन तालिका बना रहा है foo
, तो अवरुद्ध लेनदेन अंत में नई foo
तालिका खोजने के बजाय एक त्रुटि प्राप्त करेगा । (संपादित करें: यह PostgreSQL 9.3 में या उससे पहले तय किया गया था)
CREATE INDEX ... CONCURRENTLY
असाधारण है, यह समवर्ती अद्यतनों की अनुमति देते हुए एक तालिका में एक सूचकांक जोड़ने के लिए तीन लेनदेन का उपयोग करता है, इसलिए इसे स्वयं लेनदेन में नहीं किया जा सकता है।
इसके अलावा डेटाबेस मेंटेनेंस कमांड का VACUUM
इस्तेमाल लेनदेन में नहीं किया जा सकता है।
foo
किसी अन्य लेन-देन को छोड़ रहा हूं और उसे पुनः बनाए रख रहा हूं, तो मैं तालिका से चयन करने का प्रयास करता हूं , तो मैं पुराने संस्करण या त्रुटि के साथ ठीक हूं। मैं नए संस्करण के साथ ठीक नहीं हूं, क्योंकि यह अभी तक प्रतिबद्ध नहीं था, इसलिए मुझे इसे नहीं देखना चाहिए। मैं एक त्रुटि के साथ ठीक हूं, क्योंकि समवर्ती लेनदेन में किसी को भी लेनदेन को फिर से शुरू करने के लिए तैयार रहना होगा। यदि त्रुटियाँ आवश्यकता से अधिक बार होती हैं तो यह प्रदर्शन को कम कर सकती है, लेकिन यह अभी भी सही है।
हालांकि यह कड़ाई से "रोलबैक" नहीं बोल रहा है, Oracle में FLASHBACK कमांड का उपयोग इन प्रकार के परिवर्तनों को पूर्ववत करने के लिए किया जा सकता है, यदि डेटाबेस को समर्थन देने के लिए कॉन्फ़िगर किया गया है।
लगता है कि अन्य उत्तर बहुत पुराने हैं।
2019 तक:
START TRANSACTION ... COMMIT;
। इसलिए आप अभी भी एक लेनदेन में DDL विवरणों को वापस नहीं ला सकते हैं यदि एक ही लेनदेन में बाद वाला विफल हो जाता है । mysql.com/doc/refman/8.0/en/… )
MySQL के साथ ऐसा नहीं किया जा सकता है , यह बहुत गूंगा है, लेकिन सच है ... (स्वीकृत उत्तर के अनुसार)
"InnoDB में क्रिएट टेबल स्टेटमेंट को एक ट्रांजेक्शन के रूप में प्रोसेस किया जाता है। इसका मतलब यह है कि यूजर का एक रोलबैक उस ट्रांजेक्शन के दौरान यूजर द्वारा किए गए टेब स्टेटमेंट को पूर्ववत नहीं करता है।"
https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html
कुछ अलग तरीके की कोशिश की और यह बस वापस रोल नहीं करेगा ..
चारों ओर काम बस एक विफलता झंडा सेट करने के लिए है और "ड्रॉप टेबल tblname" अगर एक प्रश्न में विफल रहा है ..