Я працюю над PHP-скриптом, який імпортує файл CSV ( customers.csv
) у таблицю MySQL ( customers
).
Перш ніж вставляти вміст CSV-файлу в таблицю mysql, я спочатку створюю резервну копію оригінальної customers
таблиці.
Я завершую весь процес імпорту (включаючи резервне копіювання) транзакцією mysql (щоб врахувати випадки, коли CSV пошкоджений десь посередині, і щоб переконатися, що імпорт є атомним).
Проблема полягає в тому, що ROLLBACK, здається, не працює, коли я викликаю його відразу після INSERT INTO
заяви: при перевірці бази даних через 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
оскільки він має справу з вставкою рядків (не визначаючи схему), НАСАЛЬНО буде транзакційним, і після 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
?