मैं 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?