トランザクションとは
データベースの領域におけるトランザクションとは、単一のアトミック操作として実行される作業の単位です。一連のデータ操作を論理的にまとめた、一貫性のある信頼性の高い単位となります。トランザクションは、ACID特性に従います。トランザクションは、この操作のシーケンスが全て一度に実行されるか、またはまったく実行されないことを保証し、トランザクションで行われた変更が永久的に保存されます。
トランザクションの開始:BEGINまたはSTART TRANSACTION
MySQLにおけるトランザクションは、BEGINまたはSTART TRANSACTIONコマンドを使用して開始されます。これらの2つの選択肢の間の選択は、SQLスクリプト内の個人の好みと可読性に大きく依存します。これらのコマンドが発行されると、MySQLは新しいトランザクションブロックを開始し、以降の全てのコマンドがこのブロックの一部になります。
トランザクションの終了:COMMIT
COMMITコマンドは、トランザクションブロックを終了するために使用されます。このコマンドにより、現在のトランザクションで行われた全ての変更が永久的に反映されます。このコマンドの実行後には、ロールバックは行えません。COMMITコマンドの使用は、トランザクションの正常な終了を示します。
トランザクションの終了:ROLLBACK
一方、変更を永久化せずにトランザクションを終了したい場合は、ROLLBACKコマンドを使用します。このコマンドは、現在のトランザクションで行われた全ての変更を元に戻します。つまり、トランザクションが存在しなかったかのようになります。トランザクションの中でエラーが発生したり問題が発生した場合、またはトランザクションが開始される前の状態に戻したい場合に便利です。
ROLLBACK操作
MySQLのトランザクションにおけるROLLBACKコマンドの動作方法について説明します。例として、usersテーブルへの変更を含む簡単な例を使用します。
トランザクション前の状態
次のスナップショットは、usersテーブルの状態を示しています。
mysql> SELECT * FROM users;
+----+------+
| id | name |
+----+------+
|  1 | John |
|  2 | Jane |
|  3 | Jack |
+----+------+
3 rows in set (0.00 sec)
ここでは、John、Jane、Jackという3人のユーザーがテーブルに存在します。
トランザクションの開始と実行
まず、id = 1のユーザーの名前を変更する目的でトランザクションを開始します。
mysql> BEGIN;
Query OK, 0 rows affected (0.01 sec)
mysql> UPDATE `users` SET `name` = "James" WHERE `id` = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
この時点で、トランザクション内ではJohnの名前がJamesに変更されました。
ROLLBACKによるトランザクションの終了
この変更を取り消す必要がある場合や、更新に問題が発生した場合、変更を確定させずにトランザクションを終了することができます。
mysql> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)
ROLLBACKコマンドにより、現在のトランザクションで行われた全ての変更が取り消されます。
ROLLBACK後の状態の確認
トランザクションがロールバックされた後、ユーザーテーブルが元の状態に戻っていることを確認できます。
mysql> SELECT * FROM users;
+----+------+
| id | name |
+----+------+
|  1 | John |
|  2 | Jane |
|  3 | Jack |
+----+------+
3 rows in set (0.00 sec)
ユーザーの名前がJohnに戻っており、ROLLBACKコマンドがトランザクション内で行われた変更を元に戻す効果を示しています。
COMMIT操作
次に、MySQLトランザクションにおけるCOMMITコマンドを示します。usersテーブルの例を使用して、この操作を理解します。
トランザクション前の状態
まず、usersテーブルの初期状態を確認します。
mysql> SELECT * FROM users;
+----+------+
| id | name |
+----+------+
|  1 | John |
|  2 | Jane |
|  3 | Jack |
+----+------+
3 rows in set (0.00 sec)
テーブルにはJohn、Jane、Jackの3人のユーザーが存在します。
トランザクションの開始と実行
次に、id = 1のユーザーの名前を変更するためのトランザクションを開始します。
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE `users` SET `name` = "James" WHERE `id` = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
トランザクションのスコープ内で、Johnの名前がJamesに更新されました。
COMMITによるトランザクションの終了
この変更を確定させ、永続化したい場合は、COMMITでトランザクションを終了します。
mysql> COMMIT;
Query OK, 0 rows affected (0.00 sec)
COMMITコマンドにより、現在のトランザクションで行われた全ての変更が永続化されます。
COMMIT後の状態の確認
トランザクション後のusersテーブルの状態を確認します。
mysql> SELECT * FROM users;
+----+------+
| id | name |
+----+------+
|  1 | James |
|  2 | Jane  |
|  3 | Jack  |
+----+------+
3 rows in set (0.00 sec)
ユーザーの名前はJamesに更新されています。これは、COMMIT操作によってトランザクション内で行われた変更が永続的に適用されることを示しています。