ฉันกำลังทำงานกับสคริปต์ PHP ซึ่งนำเข้าไฟล์ CSV ( customers.csv) ลงในตาราง MySQL (customers )
ก่อนที่จะแทรกเนื้อหาของไฟล์ CSV ลงในตาราง mysql ฉันสำรองข้อมูลcustomersตารางดั้งเดิมก่อน
ฉันกำลังห่อกระบวนการนำเข้าทั้งหมด (รวมถึงการสำรองข้อมูล) ในธุรกรรม mysql (เพื่อพิจารณากรณีที่ CSV เสียหายที่ไหนสักแห่งที่อยู่ตรงกลางและเพื่อให้แน่ใจว่าการนำเข้านั้นเป็นอะตอม)
ปัญหาคือว่าย้อนกลับดูเหมือนจะไม่ทำงานเมื่อฉันเรียกมันว่าหลังจากที่INSERT INTOคำสั่ง: เมื่อตรวจสอบฐานข้อมูลผ่านทาง phpMyAdmin ฉันสามารถดูตารางที่สร้างขึ้นใหม่และแถวภายในมันยังคงอยู่หลังจาก roollback
นี่คือบันทึกการทำงาน:
[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มีการเรียกใช้depsite ธุรกรรมจะไม่ถูกยกเลิก ฉันเข้าใจว่า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
และนี่คือผลลัพธ์ของตาราง desination:
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?