ペチパーノート

WEB開発系Tipsブログです。

MySQLのトランザクション処理中にALTERするとコミットされる

トランザクションが効かずハマったことが何度かあります(笑)
InnoDBのつもりがMyISAMで作ってたとか。。

あとはトランザクション開始後に特定のDDLを発行すると
暗黙的にコミットされます。
ってか知らなかったけどされちゃいました。

やってみる

ユーザーテーブルがあります。

mysql> select * from users;
+----+------+
| id | name |
+----+------+
|  1 | taro |
+----+------+
1 row in set (0.01 sec)

トランザクションを開始します。

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

名前を変更します。

mysql> update users set name='jiro';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

ロールバックします。

mysql> rollback;
Query OK, 0 rows affected (0.17 sec)

戻りました。

mysql> select * from users;
+----+------+
| id | name |
+----+------+
|  1 | taro |
+----+------+
1 row in set (0.00 sec)

今度は途中でALTER挟んでみます

ユーザーテーブルがあります

mysql> select * from users;
+----+------+
| id | name |
+----+------+
|  1 | taro |
+----+------+
1 row in set (0.00 sec)

トランザクション開始します

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

名前を変更します

mysql> update users set name='jiro';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

オートインクリメント値を変更します

mysql> alter table users auto_increment=1;
Query OK, 1 row affected (0.41 sec)
Records: 1  Duplicates: 0  Warnings: 0

ロールバックします

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

戻りません

mysql> select * from users;
+----+------+
| id | name |
+----+------+
|  1 | jiro |
+----+------+
1 row in set (0.00 sec)

データ全削除後にIDを1からにしたい。
そんな健気な思いがこのバグを産んだのだと思います。合掌