रोलस्ट INSERT INTO नव निर्मित गंतव्य तालिका के बाद काम नहीं करता है


11

मैं PHP-स्क्रिप्ट पर काम कर रहा हूं जो CSV फ़ाइल ( customers.csv) को MySQL टेबल ( customers) में आयात करता है ।

CSV- फाइल की सामग्री को mysql तालिका में डालने से पहले मैं पहली बार मूल customersतालिका का समर्थन कर रहा हूं ।

मैं एक mysql लेन-देन में पूरी आयात प्रक्रिया (बैक अप सहित) को लपेट रहा हूं (ऐसे मामलों के लिए जब सीएसवी बीच में कहीं भ्रष्ट है, और आयात सुनिश्चित करने के लिए परमाणु है)।

समस्या यह है कि जब मैं INSERT INTOबयान के बाद इसे सही कह रहा हूं, तो ROLLBACK काम नहीं करता है : phpMyAdmin के माध्यम से डेटाबेस की जांच करते समय मैं नए बनाए गए टेबल और ROWS INSIDE IT को रोलबैक के बाद भी देख सकता हूं

यहाँ संचालन का लॉग है:

[2015-01-19 14:08:11] DEBUG: "START TRANSACTION" [] []
[2015-01-19 14:08:11] DEBUG: SHOW TABLES LIKE :table_name; [] []
[2015-01-19 14:08:28] DEBUG: CREATE TABLE `customers__20150119_14_08_20` LIKE `customers` [] []
[2015-01-19 14:08:37] DEBUG: INSERT INTO `customers__20150119_14_08_20` SELECT * FROM `customers` [] []
[2015-01-19 14:08:50] DEBUG: "ROLLBACK" [] []

इसलिए मुझे आश्चर्य है कि डिप्सिट क्यों ROLLBACKकहा जाता है, लेनदेन रद्द नहीं किया जाता है। मैं समझता हूं कि CREATE TABLEप्रकृति में लेन-देन नहीं है और इसे वापस नहीं लाया जा सकता है। लेकिन मैं यह मान रहा था कि INSERT INTOक्योंकि यह पंक्तियों को सम्मिलित करने (स्कीमा को परिभाषित न करने) से संबंधित है, वास्तव में लेन-देन होगा, और रोलबैक के बाद मुझे खाली गंतव्य तालिका के साथ छोड़ दिया जाएगा। ऐसा क्यों नहीं है?

और यहाँ उत्पादन SHOW CREATE TABLE customers(इसलिए मेरी तालिका है InnoDb):

CREATE TABLE `customers` (
 `Code` varchar(32) NOT NULL,
 `Name` varchar(128) DEFAULT NULL,
 `Price` varchar(128) DEFAULT NULL,
 PRIMARY KEY (`Code`),
 KEY `Price` (`Price`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

और डेसिनेशन टेबल के लिए यहाँ आउटपुट है:

CREATE TABLE `customers__20150119_14_08_20` (
 `Code` varchar(32) NOT NULL,
 `Name` varchar(128) DEFAULT NULL,
 `Price` varchar(128) DEFAULT NULL,
 PRIMARY KEY (`Code`),
 KEY `Price` (`Price`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

क्या व्यवहार वही है यदि आप पहले create table, फिर से करते हैं start transaction, insert, rollback?
ypercube y

मैं बस इतना कहने वाला था कि !!!
रोलैंडमाइसीडीडीबीए

क्या आप अपने प्रोग्राम में कनेक्शन पर ऑटोकॉमिट को अक्षम करते हैं?
मस्तकियो

जवाबों:


13

कारण यह है कि कुछ बयान, जैसे CREATE TABLEएक अंतर्निहित प्रतिबद्ध का कारण बनते हैं। आप उनके बारे में दस्तावेज़ीकरण में पढ़ सकते हैं: कथन जो कि एक निहित प्रतिबद्धता है

तो बयानों का मूल क्रम:

START TRANSACTION
SHOW TABLES LIKE customers
CREATE TABLE `customers__20150119_14_08_20` LIKE `customers`
INSERT INTO `customers__20150119_14_08_20` SELECT * FROM `customers`
ROLLBACK

में विस्तार होगा:

START TRANSACTION ;   -- transaction context created
SHOW TABLES LIKE customers ;

COMMIT ;              -- CREATE TABLE forces commit before itself
                      --     (at this point the previous transaction is done.)
START TRANSACTION ;   -- and a new transaction  
CREATE TABLE `customers__20150119_14_08_20` 
    LIKE `customers` ;
COMMIT ;              -- CREATE TABLE forces commit after itself. 
                      -- At this point there's no transaction context

START TRANSACTION ;   --  starts a new transaction
INSERT INTO `customers__20150119_14_08_20` 
    SELECT * FROM `customers` ;
COMMIT ;              -- caused by "autocommit on" setting (guess). 

ROLLBACK ;            -- this rollback HAS NOTHING to undo

समाधान यह होगा कि आप लेन-देन शुरू करें (या एक नया) CREATE TABLEस्टेटमेंट के बाद या एक अस्थायी तालिका का उपयोग करें।


@Dimitry, संपादन के लिए thnx।
ypercube y

1
और अपनी तरह के शब्दों के लिए @RolandoMySQLDBA। मैं आज FGITW हूं (और आपसे केवल 15 सेकंड तेज?)
ypercubeᵀᴹ

@ आपका स्वागत है! मुझे यह पता लगाने में cause an implicit commitथोड़ा समय लगा कि वास्तव में यह CREAT TABLE कहां होगा ... इसलिए पेपर आउटवे पर इस रूपरेखा को करना पड़ा :) @RolandoMySQLDBA रैपिड इनपुट के लिए भी धन्यवाद। मैंने पिछले वर्ष में आपके दर्जनों उत्तर पढ़े हैं और उन्होंने मेरी बहुत मदद की है !!
दिमित्री के

तो तुम कह रहे हो कि निहित प्रतिबद्ध से पहलेINSERT , DDL बयान की वजह से, यह भी किसी भी तरह का कारण बनता है एक प्रतिबद्ध के बाद डालने?
१५:१५ को

1
हां, तर्क पर दो भाग हैं लेकिन मेरी राय में मुख्य भाग यह है कि ओपी यह पता नहीं लगा सकता कि निर्माण तालिका द्वारा निहित वचन था।
ypercube y

3

ऐसा लग रहा है कि बयानों का क्रम समस्या पैदा कर रहा है।

अपनी पुरानी पोस्ट पंक्ति में ACID ट्रांज़ैक्शन इनोडब के भीतर लॉक करने पर , मैंने 12 स्टेटमेंट्स का नाम दिया, जो ट्रांजेक्शन को रुक-रुक कर करते हैं। आपके विशेष मामले में, यह CREATE TABLEकथन था ।

एक बार जब आप CREATE TABLEएक START TRANSACTION... COMMIT/ROLLBACKब्लॉक के अंदर भाग गए , तो रोलबैक करने के लिए कोई रूपरेखा नहीं थी।

बस CREATE TABLEपहले चलाएं START TRANSACTIONऔर आपको ठीक होना चाहिए।

कोशिश तो करो !!!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.