InnoDB में, यदि आपने ऑटोकॉमिट की डिफ़ॉल्ट सेटिंग नहीं बदली है, जो "चालू" है, तो आपको एकल प्रश्नों के लिए स्पष्ट रूप से लेनदेन शुरू करने या समाप्त करने की आवश्यकता नहीं है। यदि ऑटोकॉमिट चालू है, तो InnoDB स्वचालित रूप से लेन-देन में प्रत्येक एकल SQL क्वेरी को संलग्न करता है, जो START TRANSACTION; query; COMMIT;
.
यदि आप स्पष्ट रूप से START TRANSACTION
. का उपयोग करते हैं InnoDB में autocommit के साथ, फिर START TRANSACTION
के बाद निष्पादित कोई भी प्रश्न बयान या तो सभी को निष्पादित किया जाएगा, या वे सभी विफल हो जाएंगे। यह बैंकिंग वातावरण में उपयोगी है, उदाहरण के लिए:यदि मैं आपके बैंक खाते में $500 स्थानांतरित कर रहा हूं, तो वह ऑपरेशन तभी सफल होना चाहिए जब राशि को मेरे बैंक बैलेंस से घटाकर आपके खाते में जोड़ दिया गया हो। तो इस मामले में, आप कुछ इस तरह चलाएंगे
START TRANSACTION;
UPDATE customers SET balance = balance - 500 WHERE customer = 'Daan';
UPDATE customers SET balance = balance + 500 WHERE customer = 'Dennis';
COMMIT;
यह सुनिश्चित करता है कि या तो दोनों क्वेरी सफलतापूर्वक चलेंगी, या कोई नहीं, लेकिन केवल एक ही नहीं। यह पोस्ट आपको लेन-देन का उपयोग कब करना चाहिए, इस पर कुछ और है।
InnoDB में, आपको शायद ही कभी पूरे टेबल को लॉक करना होगा; InnoDB, MyISAM के विपरीत, पंक्ति-स्तरीय लॉकिंग का समर्थन करता है। इसका मतलब है कि ग्राहकों को पूरी तालिका को लॉक करने की आवश्यकता नहीं है, जिससे अन्य ग्राहकों को प्रतीक्षा करने के लिए मजबूर होना पड़ता है। ग्राहकों को केवल उन पंक्तियों को लॉक करना चाहिए जिनकी उन्हें वास्तव में आवश्यकता है, जिससे अन्य ग्राहक उन पंक्तियों तक पहुँच जारी रख सकें जिनकी उन्हें आवश्यकता है।
आप InnoDB लेनदेन के बारे में यहां . गतिरोध के बारे में आपके प्रश्नों के उत्तर अनुभागों में दिए गए हैं 14.2.8.8.8 और 14.2.8.9 डॉक्स की। यदि कोई क्वेरी विफल हो जाती है, तो आपका MySQL ड्राइवर कारण बताते हुए एक त्रुटि संदेश लौटाएगा; यदि आवश्यक हो तो आपके ऐप को प्रश्नों को फिर से जारी करना चाहिए।
अंत में, आपके उदाहरण कोड में, आपने mysql_query
. का उपयोग किया है . यदि आप नया कोड लिख रहे हैं, तो कृपया पुराने, धीमे, और बहिष्कृत mysql_
का उपयोग करना बंद कर दें PHP के लिए लाइब्रेरी और mysqli_
. का उपयोग करें या इसके बजाय पीडीओ :)