CSV 파일 ( customers.csv
)을 MySQL 테이블 ( customers
) 로 가져 오는 PHP 스크립트를 작성 중 입니다.
CSV 파일의 내용을 mysql 테이블에 삽입하기 전에 먼저 원래 customers
테이블을 백업 합니다.
전체 가져 오기 프로세스 (백업 포함)를 mysql 트랜잭션으로 래핑하고 있습니다 (중간 어딘가에 CSV가 손상된 경우를 고려하고 가져 오기가 원자적임을 보장하기 위해).
문제는 ROLLBACK이 INSERT INTO
명령문 직후에 호출 할 때 작동하지 않는 것 입니다.
작업 로그는 다음과 같습니다.
[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" [] []
그래서 왜 depsite 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
그리고 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
?