ここではMySQLのトランザクション管理について学習します。実際にMySQLのクライアントプログラムを起動して、トランザクションを管理する様子を確認していきましょう。
(補足)テーブルの確認
これから categories
テーブルを使ってトランザクションの仕組みについて確認します。事前に以下のとおり、レコードが出力されることを確認しておいてください。
MariaDB [eldb]> select * from categories;
+----+-------------+
| id | title |
+----+-------------+
| 1 | Programming |
| 2 | Design |
| 3 | Marketing |
+----+-------------+
3 rows in set (0.00 sec)
MariaDB [eldb]>
もしデータが異なる場合は、以下のSQLを実行して categories
テーブルのレコードを再登録しておいてください。
delete from categories;
insert into categories (id, title) values (1, 'Programming');
insert into categories (id, title) values (2, 'Design');
insert into categories (id, title) values (3, 'Marketing');
トランザクションの使用例 - commit する場合
それでは実際にMySQLを使ってトランザクション管理を行う様子を見ていきましょう。ここではAさん、Bさんの2人がMySQLを操作する様子を想定して、以下のシナリオに沿ってMySQLを操作します。
作業No | Aさんの操作 | Bさんの操作 |
---|---|---|
1 | begin; |
|
2 | insert into categories values(4, 'Piano'); |
|
3 | insert into categories values(5, 'Guitar'); |
|
4 | select * from categories; ※Aさんにはコミットされていない結果が表示される |
|
5 | select * from categories; ※Bさんにはコミットされていない結果は表示されない |
|
6 | commit; |
|
7 | select * from categories; ※Bさんにもコミットされた結果が表示される |
まずはAさん、Bさんを想定して2つのMySQLクライアントプログラムを起動します。
両方のMySQLクライアントプログラムに
root
ユーザでログインします。またuse eldb
としてeldb
データベースに接続しておきます。
作業No.1 の手順にしたがってAさんのMySQLクライアントプログラム上で begin
コマンドを入力します。
MariaDB [eldb]> begin;
Query OK, 0 rows affected (0.00 sec)
MariaDB [eldb]>
Query OK
と表示されればSQLは正しく処理できています。ここで begin
命令が成功したので、AさんのMySQLクライアントプログラムがトランザクションを開始した状態になっています。begin
命令でトランザクションを開始すると、以降に実行するSQLは commit
命令を実行されるまでデータベースには反映されません。
次に作業No.2、3 の手順にしたがってAさんのMySQLクライアントプログラム上で insert
文を2件入力します。
MariaDB [eldb]> insert into categories values(4, 'Piano');
Query OK, 1 row affected (0.00 sec)
MariaDB [eldb]> insert into categories values(5, 'Guitar');
Query OK, 1 row affected (0.00 sec)
MariaDB [eldb]>
Query OK
と表示されればSQLは正しく処理できています。ここでAさんのトランザクション上で2件の新規レコードが追加されたことになります。
次に作業No.4 の手順にしたがって、AさんのMySQLクライアントプログラム上で select
文を入力してみましょう。
MariaDB [eldb]> select * from categories;
+----+-------------+
| id | title |
+----+-------------+
| 1 | Programming |
| 2 | Design |
| 3 | Marketing |
| 4 | Piano |
| 5 | Guitar |
+----+-------------+
5 rows in set (0.00 sec)
MariaDB [eldb]>
上記の実行結果のように、さきほど insert
文で追加した id
が 4
と 5
のレコードを確認できます。現時点ではトランザクションをコミットしていませんが、トランザクションを開始したAさんは最新の結果を確認できます。
次に作業No.5 の手順にしたがって、BさんのMySQLクライアントプログラムから同様の select
文を実行します。
MariaDB [eldb]> select * from categories;
+----+-------------+
| id | title |
+----+-------------+
| 1 | Programming |
| 2 | Design |
| 3 | Marketing |
+----+-------------+
3 rows in set (0.00 sec)
MariaDB [eldb]>
そうするとAさんの結果とは異なり、categories
テーブルのレコードは3件しか表示されていないことがわかります。これはAさん実行したSQL(No.3, 4 の insert
文)はトランザクション管理下にあり、まだコミットされていないためです。
次に作業No.6 の手順にしたがって、AさんのMySQLクライアントプログラムから commit
命令を実行します。
MariaDB [eldb]> commit;
Query OK, 0 rows affected (0.00 sec)
MariaDB [eldb]>
Query OK
と表示されればSQLは正しく処理できています。ここでAさんのトランザクションはコミットされたので、追加した2件のレコードはデータベースに反映されます。
さいごに作業No.7 の手順にしたがって、BさんのMySQLクライアントプログラムから前回と同じ select
文を実行してみましょう。
MariaDB [eldb]> select * from categories;
+----+-------------+
| id | title |
+----+-------------+
| 1 | Programming |
| 2 | Design |
| 3 | Marketing |
| 4 | Piano |
| 5 | Guitar |
+----+-------------+
5 rows in set (0.00 sec)
MariaDB [eldb]>
そうするとトランザクションがコミットされたので、あらたに追加された2件を含む、合計5件のレコードを確認できるでしょう。
以降のロールバックについての動作確認をするために
delete from categories where id >= 4;
を実行して作成したレコードを削除しておいてください。