私は、CSVファイル(customers.csv
)をMySQLテーブル(customers
)にインポートするPHPスクリプトに取り組んでいます。
mysqlテーブルにCSVファイルの内容を挿入する前に、最初に元のcustomers
テーブルをバックアップしています。
mysqlトランザクションでインポートプロセス全体(バックアップを含む)をラップしています(CSVが途中で破損している場合を考慮し、インポートがアトミックであることを確認するため)。
問題は、ステートメントの直後にROLLBACKを呼び出したときにROLLBACKが機能しないように見えることですINSERT INTO
。phpMyAdminを介してデータベースをチェックすると、新しく作成されたテーブルとROROW INSIDE ITがroollback後も存在していることがわかります。
操作のログは次のとおりです。
[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
そしてここに宛先テーブルの出力があります:
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
ですか?