Sto lavorando allo script PHP che importa il file CSV ( customers.csv
) nella tabella MySQL ( customers
).
Prima di inserire il contenuto del file CSV nella tabella mysql, eseguo il backup della customers
tabella originale .
Sto avvolgendo l'intero processo di importazione (incluso il backup) in una transazione mysql (per tenere conto dei casi in cui CSV è danneggiato da qualche parte nel mezzo e per garantire che l'importazione sia atomica).
Il problema è che ROLLBACK non sembra funzionare quando lo chiamo subito dopo la INSERT INTO
dichiarazione: quando controllo il database tramite phpMyAdmin posso vedere la tabella appena creata E LE FILE ALL'INTERNO sono ancora presenti dopo il roollback .
Ecco il registro delle operazioni:
[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" [] []
Quindi mi chiedo perché ROLLBACK
viene chiamato depsite , la transazione non viene annullata. Capisco che CREATE TABLE
non è di natura transazionale e non può essere ripristinato. Ma supponevo che, INSERT INTO
poiché si tratta di inserire righe (non definendo lo schema), SARANNO effettivamente transazionali e dopo ROLLBACK rimarrò con una tabella di destinazione vuota. Perché non è così?
Ed ecco l'output SHOW CREATE TABLE customers
(quindi la mia tabella è 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
ed ecco l'output per la tabella di 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
, allorastart transaction, insert, rollback
?