トランザクションを活用することで、中途半端な状態でデータが更新されることを防ぐことができます。ここでは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)