2011-10-12 13 views
6

उदाहरण के लिए, मेरे पास कॉलम C1 value = 'clean' के साथ एक पंक्ति है, और दो अलग-अलग क्लाइंट पर एक ही समय:MyISAM और InnoDB में एकल mysql कथन परमाणु हैं?

update T1 set C1 = 'dirty' where Id = 1 

लेन-देन का उपयोग किए बिना यह क्वेरी चलाते हैं, क्या यह की गारंटी है कि इंजन प्रकार पर ध्यान दिए बिना मूल्य mysql_affected_rows() का 1 एक क्लाइंट और 0 के लिए दूसरे के लिए होगा?

+1

यदि आपको परमाणु की आवश्यकता है, लेकिन इनो डीबी टेबल का उपयोग नहीं करना चाहते हैं, [MySQL लॉक टेबल देखें] (http://dev.mysql.com/doc/refman/5.1/en/lock-tables।एचटीएमएल) – bobobobo

उत्तर

11

हाँ और नहीं :-)

दोनों मामलों में, access is serialised (यह मानते हुए आप InnoDB की तरह एक व्यवहार इंजन का उपयोग कर रहे हैं) के बाद से वे एक ही पंक्ति मारा, तो वे एक दूसरे के साथ हस्तक्षेप नहीं करेगा। दूसरे शब्दों में, बयान परमाणु हैं।

हालांकि, जब आप कनेक्शन खोलते हैं तो प्रभावित पंक्ति गणना वास्तव में आपके कॉन्फ़िगरेशन सेट पर निर्भर करती है। page for mysql_affected_rows() यह कहना है (मेरे बोल्ड):

अद्यतन बयान के लिए, डिफ़ॉल्ट रूप से प्रभावित-पंक्तियों मूल्य पंक्तियों की संख्या वास्तव में बदल रहा है। यदि आप mysqld से कनेक्ट करते समय mysql_real_connect() में CLIENT_FOUND_ROWS ध्वज निर्दिष्ट करते हैं, तो प्रभावित पंक्तियों पंक्तियों की संख्या "मिली"; वह है, जहां WHERE खंड से मेल खाता है।

और the mysql_real_connect page से:

CLIENT_FOUND_ROWS: लौटें की संख्या पाया (मिलान) पंक्तियों, नहीं की संख्या पंक्तियों बदल दिया है।

तो, होताCLIENT_FOUND_ROWS साथ के मामले में विन्यस्त किया जा रहा, के लिए प्रभावित पंक्तियों:

UPDATE T1 SET C1 = 'dirty' WHERE id = 1 

कुछ भी नहीं साथ क्या करना है डेटा बदल रहा है या नहीं, केवल क्या पंक्तियों मिलान किया गया। यह दोनों प्रश्नों के लिए 1 होगा।

दूसरी ओर, CLIENT_FOUND_ROWS था नहीं सेट, दूसरी क्वेरी वास्तव में नहीं पंक्ति को बदलने होगा अगर (क्योंकि यह पहले से ही 'गंदा' के साथ आबादी है) और शून्य का एक पंक्ति संख्या के लिए होगा।

आप ही व्यवहार है कि सेटिंग (केवल दिखाए जाने वाले परिवर्तनों) की परवाह किए बिना चाहते हैं तो आपके जैसे कुछ इस्तेमाल कर सकते हैं:

UPDATE T1 SET C1 = 'dirty' WHERE id = 1 AND C1 <> 'dirty' 
+0

क्या आप कहने का मतलब है कि एकल-स्टेटमेंट अपडेट MyIASM के लिए परमाणु नहीं हैं? – Pacerier

+0

एक त्वरित Google सुझाव देता है कि MyISAM अधिकतर परमाणु है जब तक आप कभी भी धागे या क्वेरी को मार नहीं सकते। http://bugs.mysql.com/bug.php?id=51193 –

+0

@sanmai: http://dev.mysql.com/doc/refman/5.5/en/innodb-locks-set.html से: लॉकिंग पढ़ें, एक अद्यतन, या एक डिलीट आमतौर पर एसक्यूएल कथन की प्रसंस्करण में स्कैन किए गए प्रत्येक इंडेक्स रिकॉर्ड पर रिकॉर्ड लॉक सेट करता है। – paxdiablo

3

MySQL एसिड अनुरूप यदि आप InnoDB की तरह एक व्यवहार भंडारण इंजन का उपयोग है।

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