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