क्या INSERT को ऑटो-कमिट किया जाता है?


13

हमारा एप्लिकेशन रिकॉर्ड जोड़ने के लिए MySQL डेटाबेस में INSERT क्वेरी फायर करता है। मैं जानना चाहता हूं कि क्या रिकॉर्ड ऑटो-कमिटेड हैं या नहीं। यदि मैं रोलबैक कमांड चलाता हूं, तो डेटाबेस कब रोलबैक करता है? क्या एक कमिट के बाद एक रोलबैक संभव है?


स्पष्टीकरण के लिए, मैंने 19 घंटे पहले 'निर्दोष' के रूप में टैग किया था, क्योंकि InnoDB COMMIT / ROLLBACK का उपयोग करता है।
RolandoMySQLDBA

यह डेवलपर्स और डीबीए को लेनदेन व्यवहार का ध्यान देने के लिए +1 मिलता है, लेन-देन का समर्थन करने वाले संगत अनुप्रयोग प्रतिमान, और इसके परिणाम (अच्छे या बुरे)।
RolandoMySQLDBA

मैंने आपके प्रश्न का उत्तर मेरे उत्तर के तहत एक टिप्पणी के साथ दिया।
रोलैंडमाइसीडीडीबीए

जवाबों:


10

आपके प्रश्न का उत्तर इस बात पर निर्भर करता है कि आप लेन-देन के भीतर हैं या नहीं, जो एक से अधिक विवरणों में होगा। (आपने प्रश्न InnoDB के साथ टैग किया है, उत्तर MyISAM के साथ अलग होगा।)

संदर्भ पुस्तिका से: http://dev.mysql.com/doc/refman/5.1/en/commit.html

डिफ़ॉल्ट रूप से, MySQL स्वतः पूर्ण मोड सक्षम होने के साथ चलता है। इसका मतलब यह है कि जैसे ही आप एक स्टेटमेंट को निष्पादित करते हैं जो एक टेबल को अपडेट (संशोधित) करता है, MySQL अपडेट को डिस्क को स्थायी बनाने के लिए स्टोर करता है।

तो हां, डिफ़ॉल्ट रूप से, यदि आप केवल उपयोग कर रहे हैं, तो आपके द्वारा INSERTडाला गया रिकॉर्ड प्रतिबद्ध होगा, और उन्हें वापस रोल करने का कोई मतलब नहीं है। (यह प्रभावी रूप से प्रत्येक कथन को बीच BEGIN- बीच में लपेटने के समान है COMMIT।)

हालाँकि, यदि आप लेन-देन स्पष्ट रूप से कर रहे हैं, तो आपको COMMITअभिलेखों को संग्रहीत करने के लिए उपयोग करना होगा, लेकिन आप इसका उपयोग करने में भी सक्षम होंगे ROLLBACK

आप START TRANSACTION(या BEGIN) का उपयोग करके स्पष्ट रूप से लेनदेन शुरू कर सकते हैं । यह autocommitसेटिंग से स्वतंत्र है (डिफ़ॉल्ट रूप से):

स्टार्ट ट्रांसक्शन के साथ, ऑटोकॉमिट तब तक निष्क्रिय रहता है जब तक आप कमिट या रोलबैक के साथ लेन-देन को समाप्त नहीं करते। ऑटोकॉमिट मोड तब अपनी पिछली स्थिति में बदल जाता है।

वैकल्पिक रूप से, अगर autocommit=0, मुझे लगता है कि लेन-देन के एक और अंत के बाद कोई भी बयान, एक लेनदेन शुरू करेगा (लेकिन आप अभी भी START TRANSACTIONस्पष्ट रूप से उपयोग कर सकते हैं ); कम से कम जिस तरह से मैं इसकी व्याख्या करता हूं :

ऑटोकॉमिट मोड। यदि 1 पर सेट किया जाता है, तो तालिका में सभी परिवर्तन तुरंत प्रभावी हो जाते हैं। यदि 0 पर सेट किया गया है, तो आपको इसे रद्द करने के लिए एक लेनदेन या रोलबैक स्वीकार करने के लिए COMMIT का उपयोग करना होगा। यदि ऑटोकॉमिट 0 है और आप इसे 1 में बदलते हैं, तो MySQL किसी भी खुले लेन-देन का स्वचालित संचार करता है। लेन-देन शुरू करने का एक और तरीका है, START TRANSACTION या BEGIN स्टेटमेंट का उपयोग करना। धारा 12.3.1, "स्टार्ट ट्रांसक्शन, कमिट और रोलबैक सिंटैक्स" देखें।

अधिक विशेष रूप से "लेन-देन शुरू करने का एक और तरीका" का अर्थ यह लगता है कि "ऑटोकॉमिट = 0" सेट करना एक लेनदेन शुरू करने के लिए पर्याप्त है (कम से कम प्रत्येक कथन सत्र शुरू होने से पहले या इसके बाद एक COMMIT/ ROLLBACK)। मैं वैसे भी BEGINया START TRANSACTIONस्पष्ट रूप से उपयोग करने का सुझाव दूंगा, भले ही autocommit=0, यह लेन-देन शुरू होने या समाप्त होने पर देखने के लिए स्पष्ट कर सकता है।

(आप लेन-देन कैसे शुरू करते हैं, यह इस बात पर निर्भर हो सकता है कि आपका आवेदन MySQL का उपयोग कैसे करता है।)


1
एक transactional प्रोटोकॉल को पूरी तरह से परिभाषित करने के लिए एक +1 का वर्णन करता है।
RolandoMySQLDBA

@Bruno, MyISAM के लिए जहां "प्रतिबद्ध" और "रोलबैक" काम नहीं करते हैं, क्या आवेषण आधा प्रतिबद्ध नहीं होगा?
पचेरियर

7

डिफ़ॉल्ट रूप से, InnoDB को autocommit = 1 या ON पर सेट किया गया हैएक बार प्रतिबद्ध होने के बाद, उन्हें वापस नहीं लाया जा सकता है

इसे आगे बढ़ाने के लिए आपको दो चीजों में से एक को करना होगा:

विकल्प 1: इसे /etc/my.cnf में जोड़ें और mysql को पुनरारंभ करें

[mysqld]
autocommit=0

विकल्प 2: किसी भी सार्थक SQL को शुरू करने से पहले खुले DB Conenction में इनमें से एक का प्रदर्शन करें

SET autocommit = 0;
START TRANSACTION;

इन दो विकल्पों के तहत, आपको एक मैनुअल COMMIT या एक मैनुअल रोलबैक प्रदर्शन करना होगा ।

चेतावनी

यदि तालिका MyISAM है, तो स्पष्टीकरण सरल है। चूंकि MyISAM भंडारण इंजन के लिए कोई लेनदेन नहीं है, सभी INSERTs, UPDATEs और निष्पादित किए गए DELETE स्थायी हैं। कोई भी रोलबैक नहीं।


अतिरिक्त स्पष्टीकरण के लिए, मेरा उत्तर InnoDB और MyISAM भंडारण इंजन दोनों को संबोधित करता है।
RolandoMySQLDBA

1
बस अगर ऑटो कमिट ऑफ इनोबीडी में ऑफ है और मेरा एप्लिकेशन इन्सर्ट क्वेरीज़ निकाल रहा है, और मैं कमिट निष्पादित करना भूल जाता हूँ, तो जल्द ही बदलाव कैसे खो जाते हैं?
RPK 9

यदि आपका आवेदन प्रत्येक INSERT के बाद मैन्युअल रूप से COMMIT करता है, तो यह लिखा जाता है और हटाया नहीं जा सकता। यदि COMMIT से पहले DB कनेक्शन मर जाता है, तो सभी परिवर्तन खो जाते हैं और रोलबैक होता है। यदि आप कोई DDL (क्रिएट टेबल, ड्रॉप टेबल, अलर्ट टेबल आदि) का प्रदर्शन करते हैं या मैन्युअल रूप से टेबल लॉक जारी करते हैं, तो INSERTs स्वत: स्वरूपित होते हैं। यदि आप START TRANSACTION का उपयोग करते हैं, तो सभी अनमैक्ड परिवर्तन प्रतिबद्ध हैं।
रोलैंडमाइसीडीडीबीए

1
"यदि आप स्टार्ट ट्रांसक्शन का उपयोग करते हैं, तो सभी असंबंधित परिवर्तन प्रतिबद्ध हैं।" (डीडीएल के संदर्भ में, अन्यथा इसे वापस ले लिया जाएगा), पहले भी एक अंतर्निहित कमिट है (प्रलेखन के अनुसार संस्करण 5.5.3 के बाद आने वाली कमिटमेंट)।
ब्रूनो

1
"यदि आप START TRANSACTION का उपयोग करते हैं, तो सभी अनमैक्ड परिवर्तन प्रतिबद्ध हैं।" - मुझे MySQL 5.0 सर्टिफिकेशन स्टडी गाइड (आईएसबीएन 0-672-32812-7) पेज 418 से यह विचार मिला है, जो कि START TRANSACTION, SET AUTOCOMMIT = 1, LOCK TABLES, UNLOCK TABLES, TRUNCATE TABLE, RENAME TABLE, DROP INDEX, DROP TABLE का नाम है। , DROP DATABASE, CREATE INDEX, BEGIN, और ALTER TABLE शीर्षक के तहत "कुछ परिस्थितियों में, वर्तमान लेन-देन का अंत हो सकता है: यदि आप निम्न में से कोई भी बयान जारी करते हैं, तो InnoDB निहितार्थ वर्तमान लेन-देन के पूर्वगामी कथनों को स्वीकार करता है और शुरू होता है नया लेनदेन ”।
रोलैंडमाइसीडीडीबीए
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.