我正在研究将CSV文件(customers.csv
)导入MySQL表(customers
)的PHP脚本。
在将CSV文件的内容插入mysql表之前,我首先备份原始customers
表。
我将整个导入过程(包括备份)包装在mysql事务中(以解决CSV在中间某处损坏的情况,并确保导入是原子的)。
问题是,当我在INSERT INTO
语句后立即调用它时,ROLLBACK似乎不起作用:通过phpMyAdmin检查数据库时,我可以看到新创建的表,并且roollback之后仍存在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
调用depsite 而不取消交易。我确实知道这CREATE TABLE
本质上不是事务性的,因此无法回滚。但是我以为是INSERT INTO
因为它处理插入行(未定义架构),所以实际上将是事务性的,并且在ROLLBACK之后我将留有空的目标表。为什么不是这样?
这是输出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
?