हमारा एप्लिकेशन रिकॉर्ड जोड़ने के लिए MySQL डेटाबेस में INSERT क्वेरी फायर करता है। मैं जानना चाहता हूं कि क्या रिकॉर्ड ऑटो-कमिटेड हैं या नहीं। यदि मैं रोलबैक कमांड चलाता हूं, तो डेटाबेस कब रोलबैक करता है? क्या एक कमिट के बाद एक रोलबैक संभव है?
हमारा एप्लिकेशन रिकॉर्ड जोड़ने के लिए MySQL डेटाबेस में INSERT क्वेरी फायर करता है। मैं जानना चाहता हूं कि क्या रिकॉर्ड ऑटो-कमिटेड हैं या नहीं। यदि मैं रोलबैक कमांड चलाता हूं, तो डेटाबेस कब रोलबैक करता है? क्या एक कमिट के बाद एक रोलबैक संभव है?
जवाबों:
आपके प्रश्न का उत्तर इस बात पर निर्भर करता है कि आप लेन-देन के भीतर हैं या नहीं, जो एक से अधिक विवरणों में होगा। (आपने प्रश्न 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 का उपयोग कैसे करता है।)
डिफ़ॉल्ट रूप से, 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 स्थायी हैं। कोई भी रोलबैक नहीं।