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