2013-10-18 9 views
5

Autocommit सक्षम के साथ InnoDB पर आधारित प्रत्येक तालिका के साथ एक MySQL डेटाबेस में, subqueries और/या परमाणु होने के साथ पूछताछ करेगा?MySQL पर एक परमाणु ऑपरेशन पर सम्मिलित/अद्यतन शामिल है?

उदाहरण:

  • INSERT INTO users SELECT (x,y,z) FROM users, comments WHERE users.id = comments.user_id; (मिलती है)

  • UPDATE users, comments SET users.x = x1 WHERE users.age > 30; (मिलती है)

  • UPDATE users, comments SET users.x = x1, comments.y = y1 WHERE users.age > 30; (मिलती है)

  • UPDATE users, comments SET users.x = x1, comments.y = y1 WHERE users.id IN (SELECT id FROM users WHERE age > 30); (सबक्वेरी)

उत्तर

5

इस

उदाहरण की तरह START TRANSACTION में उन्हें लपेटो मैं की तरह "अपने आप में उन प्रश्नों एक परमाणु आपरेशन के प्रत्येक है?" अपने प्रश्न को समझते हैं। फिर जवाब "हां" है। अन्य दो उत्तरों सही हैं, जब वे कहते हैं कि आपके सभी बयान एक साथ परमाणु नहीं हैं।

डेटाबेस में परमाणुता केवल सभी या कुछ भी नहीं है। यह का मतलब डेटा की शुद्धता का नहीं है। आपका कथन सफल होता है या नहीं। इसमें शामिल होने या सबक्वायरी के साथ कुछ लेना देना नहीं है। एक कथन एक कथन है, इससे कोई फर्क नहीं पड़ता कि आपके डेटाबेस को मेमोरी या डिस्क पर अस्थायी तालिका का उपयोग करना है या नहीं।

लेनदेन सिर्फ एक ही कथन के रूप में एकाधिक बयानों का इलाज करने के लिए अपने डेटाबेस को बताएं। जब कोई बयान विफल रहता है, तो वे सभी वापस लुढ़क जाते हैं।

यहां एक महत्वपूर्ण संबंधित विषय isolation level है। आप उन लोगों के बारे में पढ़ना चाह सकते हैं।

संपादित करें (टिप्पणी जवाब देने के लिए):

यह सही है। जब तक यह एक वैध कथन है और कोई बिजली विफलता नहीं होती है या अन्य कारणों से कोई प्रश्न विफल हो सकता है, यह किया जा रहा है। परमाणुता केवल गारंटी देता है कि कथन (ओं) किया जा रहा है या नहीं। यह पूर्णता की गारंटी देता है और वह डेटा भ्रष्ट नहीं है (क्योंकि एक लेखन ऑपरेशन समाप्त नहीं हुआ है या कुछ)। यह आपको डेटा की शुद्धता की गारंटी नहीं देता है।INSERT INTO foo SELECT MAX(id) + 1 FROM bar; जैसी क्वेरी को देखते हुए आपको सही अलगाव स्तर सेट करने के माध्यम से सुनिश्चित करना होगा, कि आपको प्रेत पढ़ने या कुछ भी नहीं मिलता है।

+0

लेकिन परमाणु होने का अर्थ यह नहीं है कि कोई अन्य प्रश्न क्वेरी निष्पादन में हस्तक्षेप नहीं करेगा? एक प्रश्न में "उपयोगकर्ताओं में से चुनें (एक्स, वाई, जेड) उपयोगकर्ताओं से, टिप्पणियां कहां उपयोगकर्ता.आईडी = टिप्पणियां.यूसर_आईडी और हालत", आपको दिया जाता है कि यदि स्थिति पूरी हो जाती है तो अपडेट सही तरीके से निष्पादित किया जाएगा बाद। क्या यह सही नहीं है? –

+0

@DamianoBarbati मेरा जवाब अपडेट किया गया। – fancyPants

+0

सहमत हैं। मेरी धारणा उस प्रश्न में 'एसक्यूएल स्टेटमेंट्स' पर आधारित थी जहां एक पंक्ति को दूसरी तालिका से कॉपी किया जा रहा था, तब उस पंक्ति में डेटा बदल दिया गया था। –

3

आपके एसक्यूएल स्टेटमेंट ऑटोोकॉमिट के साथ परमाणु रूप से निष्पादित नहीं होंगे। ऑटोकॉमिट बंद करने के लिए आपको एक लेनदेन शुरू करने की आवश्यकता है। देखें http://dev.mysql.com/doc/refman/5.0/en/commit.html

4

नहीं। जब तक आप से Mysql manual

+0

वह एक ही बयान के भीतर परमाणुता के बारे में बात कर रहा है। – Pacerier

0

मुझे यह नहीं लगता है, और मैं आपको समझाऊंगा क्यों। मेरे पास MySQL के साथ वास्तव में अजीब समस्या थी।

कल्पना कीजिए कि आपके पास एक ही रिकॉर्ड के साथ "table1" नाम की एक तालिका है। कॉलम एफ 1 का "ए" का मान है।कॉलम एफ 2 का मूल्य "बी"

Update table1 set f1 = CONCAT(f1,f2), f2 = 'C'; 

एफ 1 का अंतिम मान अपेक्षित के रूप में 'एबी' है।

लेकिन आप आदेश को बदल अगर:

Update table1 set f2 = 'C', f1 = CONCAT(f1,f2); 

f1 के अंतिम मूल्य 'एसी' है। यही है: एफ 2 पहले बदल दिया गया है, और उसके बाद एफ 1।

मेरा निष्कर्ष यह है कि अद्यतन ऑपरेशन स्पष्ट रूप से गैर-परमाणु है। पहले f2 बदल दिया गया है। एफ 1 के अद्यतन मूल्य का उपयोग करने के बाद f1 बदल दिया गया है, मूल नहीं।

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