トランザクションが効かずハマったことが何度かあります(笑)
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からにしたい。
そんな健気な思いがこのバグを産んだのだと思います。合掌