Tôi đang làm việc trên tập lệnh PHP để nhập tệp CSV ( customers.csv
) vào bảng MySQL ( customers
).
Trước khi chèn nội dung của tệp CSV vào bảng mysql, trước tiên tôi sao lưu customers
bảng gốc .
Tôi đang bao bọc toàn bộ quá trình nhập (bao gồm cả sao lưu) trong giao dịch mysql (để giải thích cho các trường hợp khi CSV bị hỏng ở đâu đó ở giữa và để đảm bảo nhập là nguyên tử).
Vấn đề là ROLLBACK dường như không hoạt động khi tôi gọi nó ngay sau INSERT INTO
câu lệnh: khi kiểm tra cơ sở dữ liệu qua phpMyAdmin tôi có thể thấy bảng mới được tạo VÀ ROWS TRONG NÓ vẫn hiện diện sau khi quay lại .
Đây là nhật ký của các hoạt động:
[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" [] []
Vì vậy, tôi tự hỏi tại sao depsite ROLLBACK
được gọi, giao dịch không bị hủy. Tôi hiểu rằng đó CREATE TABLE
không phải là giao dịch về bản chất và không thể quay trở lại. Nhưng tôi đã giả định rằng INSERT INTO
vì nó liên quan đến việc chèn các hàng (không xác định lược đồ), SILL thực sự là giao dịch và sau ROLLBACK, tôi sẽ bị bỏ lại với bảng đích trống. Tại sao nó không phải là trường hợp?
Và đây là đầu ra SHOW CREATE TABLE customers
(vì vậy bảng của tôi là 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
và đây là đầu ra cho bảng giảm dần:
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
, sau đóstart transaction, insert, rollback
?