2011-01-14 16 views
78

मैं ऐसे कार्यक्रम पर काम कर रहा हूं जो डीडीएल जारी करता है। मैं जानना चाहता हूँ कि क्या CREATE TABLE और इसी तरह के DDL मेंक्या प्रमुख SQL डेटाबेस में तालिका बनाएं और वैकल्पिक तालिका विवरण वापस रोल करना संभव है?

  • Postgres वापस लुढ़काया जा सकता है चाहते हैं
  • MySQL
  • SQLite
  • एट अल

तरीके का वर्णन करें प्रत्येक डेटाबेस DDL के साथ लेनदेन संभालती है।

+6

समुदाय विकी? – araqnid

उत्तर

107

http://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis PostgreSQL के परिप्रेक्ष्य से इस समस्या का एक सिंहावलोकन प्रदान करता है।

क्या इस दस्तावेज़ के अनुसार डीडीएल लेनदेन है?

  • PostgreSQL - हाँ
  • MySQL - कोई; डीडीएल एक अंतर्निहित प्रतिबद्धता
  • ओरेकल डेटाबेस 11 जी रिलीज 2 और ऊपर - डिफ़ॉल्ट रूप से, नहीं, लेकिन संस्करण-आधारित पुनर्वितरण नामक एक विकल्प मौजूद है
  • ओरेकल के पुराने संस्करण - नहीं; हाँ
  • Sybase अनुकूली सर्वर - - हाँ
  • डीबी 2 - हाँ
  • इन्फोर्मिक्स - DDL एक अंतर्निहित प्रतिबद्ध
  • एसक्यूएल सर्वर का कारण बनता है हाँ
  • Firebird (Interbase) - हाँ

SQLite भी प्रतीत होता है लेनदेन डीडीएल भी है। मैं SQLite में ROLLBACKCREATE TABLE कथन में सक्षम था। इसका CREATE TABLE दस्तावेज़ीकरण किसी विशेष लेनदेन 'गॉथचास' का उल्लेख नहीं करता है।

+5

हालांकि, SQLite के लिए डिफ़ॉल्ट पायथन ड्राइवर लेनदेन एसक्यूएल को रोकता है। http://bugs.python.org/issue10740 – joeforker

+0

तो जवाब है "हां, उन्हें वापस घुमाया जा सकता है, जब तक कि आप MySQL या ओरेकल के पुराने संस्करणों का उपयोग नहीं कर रहे हों।" – rjmunro

+0

नहीं, सूचीबद्ध अन्य लोगों के अलावा अन्य SQL डेटाबेस भी हैं। – joeforker

3

हालांकि यह ओरेकल में "रोलबैक" कड़ाई से नहीं बोल रहा है, तो फ्लैशबैक कमांड का उपयोग इन प्रकार के परिवर्तनों को पूर्ववत करने के लिए किया जा सकता है, यदि डेटाबेस को इसका समर्थन करने के लिए कॉन्फ़िगर किया गया है।

19

पोस्टग्रेएसक्यूएल में अधिकांश डेटाबेस ऑब्जेक्ट्स (निश्चित रूप से टेबल, इंडेक्स इत्यादि, लेकिन डेटाबेस नहीं, उपयोगकर्ताओं के लिए लेनदेन डीडीएल है)। हालांकि व्यावहारिक रूप से किसी भी डीडीएल को लक्ष्य वस्तु पर ACCESS EXCLUSIVE लॉक मिलेगा, जिससे डीडीएल लेनदेन समाप्त होने तक इसे पूरी तरह से पहुंच योग्य बना दिया जा सकता है। साथ ही, सभी परिस्थितियों को काफी संभाला नहीं जाता है- उदाहरण के लिए, यदि आप तालिका foo से चयन करने का प्रयास करते हैं, जबकि दूसरा लेनदेन इसे छोड़ रहा है और प्रतिस्थापन तालिका foo बना रहा है, तो अवरुद्ध लेनदेन को अंततः नई foo तालिका खोजने के बजाय त्रुटि प्राप्त होगी। (संपादित करें: यह PostgreSQL 9.3 में या इससे पहले तय किया गया था)

CREATE INDEX ... CONCURRENTLY असाधारण है, यह समवर्ती अद्यतनों की अनुमति देते हुए एक तालिका में एक इंडेक्स जोड़ने के लिए तीन लेनदेन का उपयोग करता है, इसलिए यह लेनदेन में स्वयं नहीं किया जा सकता है।

इसके अलावा डेटाबेस रखरखाव कमांड VACUUM लेनदेन में उपयोग नहीं किया जा सकता है।

+0

'पहुंच असाधारण' जानकारी के लिए +1 –

+0

मैं तर्क दूंगा कि यदि मैं कोशिश करता हूं तालिका 'foo' से चयन करने के लिए, जबकि दूसरा लेनदेन छोड़ रहा है और इसे पुनर्निर्माण कर रहा है, तो मैं ठीक हूं पुराने संस्करण या त्रुटि के साथ। मैं नए संस्करण के साथ ठीक नहीं हूं, क्योंकि यह अभी तक प्रतिबद्ध नहीं था, इसलिए मुझे इसे नहीं देखना चाहिए। मैं एक त्रुटि के साथ ठीक हूं, क्योंकि समवर्ती लेनदेन में किसी को लेनदेन को फिर से शुरू करने के लिए तैयार रहना होगा। यदि त्रुटियों की आवश्यकता अक्सर अधिक होती है तो यह प्रदर्शन को कम कर सकती है, लेकिन यह अभी भी सही है। –

+0

@JanHudec: आपको नई तालिका का एक असामान्य संस्करण नहीं दिखाई देगा, केवल पूरे लेनदेन का नतीजा जो इसे गिरा/पुनर्निर्मित करता है। यानी एक लेनदेन जो एक टेबल को छोड़ देता है, पुनर्निर्मित करता है और दोबारा तैयार करता है, उस तालिका से चुनने वाली अन्य प्रक्रियाओं पर प्रभावी ढंग से परमाणु wrt है। (लेकिन जैसे ही वे टेबल की स्कीमा को पढ़ने की कोशिश करते हैं, सब कुछ अवरुद्ध हो जाएगा) – araqnid

0

MySQL के साथ नहीं किया जा सकता है ऐसा लगता है, बहुत गूंगा ..

"InnoDB में CREATE TABLE बयान एकल लेन-देन के रूप में संसाधित किया जाता है।इसका मतलब है कि उपयोगकर्ता से एक रोलबैक टेबल कथन बनाएं कि लेन-देन के दौरान किए गए उपयोगकर्ता को पूर्ववत नहीं है। "

https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

कुछ भिन्न तरीकों की कोशिश की और यह बस वापस रोल नहीं होगा ..

चारों ओर काम करना विफलता झंडा सेट करना है और यदि कोई प्रश्न विफल हुआ है तो "ड्रॉप टेबल tblname" करें ..

संबंधित मुद्दे