読者です 読者をやめる 読者になる 読者になる

MySQLでトランザクションしたかった話

事の始まり

間違ってUPDATEしてしまった。
UPDATE文にwhere句をつけるのを忘れてしまい、全てのデータが更新されてしまった。

Query OK, 777 rows affected (0.01 sec)
Rows matched: 777  Changed: 777  Warnings: 0

やってしまった。進化情報がすべてニョロモになってしまった。

次からはちゃんとトランザクションしよう!

ちゃんとトランザクションしようと心に誓い、方法を調べてみる。
どうやらBEGINしてUPDATEしてROLLBACK/COMMITすればいいらしいの。

mysql> select lat from building limit 1;
+-----------+
| lat       |
+-----------+
| 30.000000 |
+-----------+
1 row in set (0.00 sec)

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

mysql> update building set lat = 35.0000000 where id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> ROLLBACK;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select lat from building limit 1;
+-----------+
| lat       |
+-----------+
| 35.000000 |
+-----------+
1 row in set (0.00 sec)

ROLLBACKできてない、UPDATEされてしまっている。
しかもwarning出てる。

mysql> SHOW WARNINGS;
+---------+------+---------------------------------------------------------------+
| Level   | Code | Message                                                       |
+---------+------+---------------------------------------------------------------+
| Warning | 1196 | Some non-transactional changed tables couldn't be rolled back |
+---------+------+---------------------------------------------------------------+
1 row in set (0.00 sec)

どうやらMySQLのEngineがinnoDBじゃないとトランザクション出来ないらしい。

mysql> SHOW TABLE STATUS;
+----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
| Name     | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time         | Check_time | Collation       | Checksum | Create_options | Comment |
+----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
| building | MyISAM |      10 | Dynamic    | 1002 |            324 |      325644 | 281474976710655 |        12288 |         0 |           1003 | 2013-12-10 03:16:51 | 2014-06-05 23:08:51 | NULL       | utf8_general_ci |     NULL |                |         |
+----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
1 row in set (0.00 sec)

現在私が使っているEngineはMyISAMでした、残念!
なんかいい方法ないすか…。