アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

トランザクションの挙動検証

トランザクションの挙動を簡単に検証。
MySQL5.6、InnoDBです。

ごく普通のコミット

BEGIN;
INSERT INTO `table`(`id`) VALUES(NULL); --①
INSERT INTO `table`(`id`) VALUES(NULL); --②
COMMIT;

当然①②ともにコミットされます。

ごく普通のロールバック

BEGIN;
INSERT INTO `table`(`id`) VALUES(NULL); --①
INSERT INTO `table`(`id`) VALUES(NULL); --②
ROLLBACK;

当然①②ともにコミットされませんでした。

途中にTRUNCATEを挟む

BEGIN;
INSERT INTO `table`(`id`) VALUES(NULL); --①
TRUNCATE TABLE `table`;                 --②
INSERT INTO `table`(`id`) VALUES(NULL); --③
ROLLBACK;

①②③がすべてコミットされます。
TRUNCATEするとその時点でトランザクションはすべてコミットされて完結し、
③はトランザクションの外で動く単発クエリとして実行されるという感じですかね。
ROLLBACKが無効になっているというか、そもそもロールバックするトランザクションがないというか。

当然、②をコミットに置き換えても同じように①③は両方コミットされます。

COMMITした直後に再度BEGIN

BEGIN;
INSERT INTO `table`(`id`) VALUES(NULL); --①
COMMIT;
BEGIN;
INSERT INTO `table`(`id`) VALUES(NULL); --②
ROLLBACK;

まあ当然ですが、ちゃんと①のみコミットされました。

トランザクションの途中でCREATE TABLE

BEGIN;
INSERT INTO `table`(`id`) VALUES(NULL);              --①
CREATE TABLE `table2` (`id` /*略*/) ENGINE = InnoDB; --②
INSERT INTO `table`(`id`) VALUES(NULL);              --③
ROLLBACK;

TRUNCATEと同じく、①②③すべてコミットされます。

ただし、一時テーブル(CREATE TEMPORARY TABLE)の場合は、②でのコミットは発生しないため、①も③もロールバックされます。

TRUNCATEやCREATE TABLE等、暗黙のコミットについてはマニュアルを参照されたし。

参考:13.3.3. 暗黙的なコミットを発生させるステートメント - MySQL
http://dev.mysql.com/doc/refman/5.6/ja/implicit-commit.html