トランザクション(BEGIN, COMMIT, ROLLBACK)

トランザクションを活用することで、中途半端な状態でデータが更新されることを防ぐことができます。ここではMySQLでトランザクションを実行する方法について確認します。

トランザクションのステートメント

  • BEGIN または START TRANSACTION でトランザクションを開始します。
  • COMMIT でトランザクションを終了します。変更は永続化されます。
  • ROLLBACK でトランザクションを終了します。変更はとりけされます。

ROLLBACKの動作確認
( 変更を取り消し )

トランザクション実行前の状態です。

mysql> SELECT * FROM users;
+----+------+
| id | name |
+----+------+
|  1 | aaa  |
|  2 | bbb  |
|  3 | ccc  |
+----+------+
3 rows in set (0.00 sec)

トランザクションを実行します。

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

mysql> UPDATE `users` SET `name` = "xxx" 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 (0.00 sec)

ROLLBACK で終了したので、レコードは更新されていません。

mysql> SELECT * FROM users;
+----+------+
| id | name |
+----+------+
|  1 | aaa  |
|  2 | bbb  |
|  3 | ccc  |
+----+------+
3 rows in set (0.00 sec)

COMMITの動作確認
( 変更を永続化 )

トランザクション実行前の状態です。

mysql> SELECT * FROM users;
+----+------+
| id | name |
+----+------+
|  1 | aaa  |
|  2 | bbb  |
|  3 | ccc  |
+----+------+
3 rows in set (0.00 sec)

トランザクションを実行します。

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

mysql> UPDATE `users` SET `name` = "xxx" WHERE `id` = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

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

COMMIT で終了したので、トランザクション内での更新が反映されました。

mysql> SELECT * FROM users;
+----+------+
| id | name |
+----+------+
|  1 | xxx  |
|  2 | bbb  |
|  3 | ccc  |
+----+------+
3 rows in set (0.00 sec)

参考・関連