トランザクション処理

複数の処理をひとつの処理単位として実行するトランザクション処理について解説します。
本章の目標
  • トランザクション処理の概念を理解する
  • トランザクション処理の方法をおぼえる
ページの先頭へ
ページの先頭へ

1.トランザクション処理

ここまでは、処理をひとつひとつ実行してきましたが、アプリケーションを開発していく中では、複数の処理を意味的には1つの処理として扱いたいケースが出てきます。 ここではトランザクション処理について学習していきます。

1. トランザクション処理の概念

前述した通り、トランザクション処理とは複数の処理を意味的には1つの処理として扱うことです。例えば注文処理を考えてみましょう。 ユーザーが商品Aを注文したとします。この場合、注文テーブルに注文データを登録すると同時に、在庫データから商品Aの在庫をマイナス1する必要があります。 ここでトランザクション処理を行わない場合はどうなるでしょうか?
例えば注文テーブルにデータを登録し、在庫テーブルから在庫をマイナスする前に何らかのトラブルが発生してプログラムが終了してしまったとします。 すると、この場合は注文テーブルと在庫テーブルに不整合が発生してしまうことになります。


このような場合は、処理①で行った注文テーブルへのデータ追加を仮登録の状態にしておき、トラブルが派生した場合、処理①で行った処理を取り消す必要があります。 この処理を取り消すことをデータベースの世界ではロールバック(ROLLBACK)すると言います。


一方、何もトラブルが発生しなかった場合、処理①と処理②で行ったデータ操作はまだ仮登録の段階ですので、仮登録の状態を確定させなければなりません。 このように、処理を確定することを、コミット(COMMIT)といいます。



2. トランザクション処理の準備

ここでは簡便のために、「bookinfo」のみで処理の流れを見ていきます。
但し、ここで注意点があります。MySQLでは、トランザクション処理を行う場合、トランザクション処理を行うためのテーブルであることを明示して作成する必要があります。 今まで使っていた「bookinfo」はトランザクション処理を行うためのテーブルであることを明示して作成していませんので、テーブルを作成しなおす必要があります。 トランザクション処理を行うことを明示して作成するには「CREATE TABLE」文に、「ENGINE=InnoDB」オブションを付けます。

CREATE TABLE bookinfo (
isbn VARCHAR(20) PRIMARY KEY,
title VARCHAR(100),
price INTEGER NOT NULL
) ENGINE=InnoDB
;


「bookinfo」テーブルを元の状態に戻してください。

isbn title Price
00001 SQL入門テキスト 1050
00002 SQL基礎テキスト 2300
00003 Java基礎テキスト 1050
00004 PHP基礎テキスト 2100
00005 Java Struts基礎テキスト 3800


DROP TABLE bookinfo;

CREATE TABLE bookinfo (
isbn VARCHAR(20) PRIMARY KEY,
title VARCHAR(100),
price INTEGER NOT NULL
) ENGINE=InnoDB
;

INSERT INTO bookinfo(isbn,title,price) VALUES('00001','SQL入門テキスト',1050);
INSERT INTO bookinfo(isbn,title,price) VALUES('00002','SQL基礎テキスト',2300);
INSERT INTO bookinfo(isbn,title,price) VALUES('00003','Java基礎テキスト',1050);
INSERT INTO bookinfo(isbn,title,price) VALUES('00004','PHP基礎テキスト',2100);
INSERT INTO bookinfo(isbn,title,price) VALUES('00005','Java Struts基礎テキスト',3800);


3. トランザクション処理の実行

トランザクション処理を開始するには「BEGIN」コマンド、ロールバックするには「ROLLBACK」コマンド、コミットするには「COMMIT」コマンドを実行します。
処理の流れとしては、

BEGIN;
                                     
実際の処理
                                     
ROLLBACK;(または)COMMIT;

となります。
まずは「bookinfo」に下記データを追加し、これを取り消して見ましょう。

isbn title price
00006 Android基礎テキスト 2000

現在のテーブルの状態を確認してみます。

SELECT * FROM bookinfo;





では実際に、トランザクション処理を開始します。

BEGIN;
INSERT INTO bookinfo(isbn,title,price) VALUES('00006','Android基礎テキスト',2000);





この状態で、テーブルの中身を確認すると・・・

SELECT * FROM bookinfo;





データが追加されているのが確認できます。

ではデータの登録処理を取り消して、もう一度テーブルの中身を確認してみましょう。

ROLLBACK;
SELECT * FROM bookinfo;





登録されたデータが取り消されているのが分かります。

今度は、テーブルのデータを一度全て削除し、これを取り消してみましょう。

BEGIN;
DELETE FROM bookinfo;
SELECT * FROM bookinfo;
ROLLBACK;
SELECT * FROM bookinfo;





一度削除されたデータが元に戻っています。

では今度は、処理を確定してみましょう。
先程のように、新たにデータを追加して、今度は確定してみます。

BEGIN;
INSERT INTO bookinfo(isbn,title,price) VALUES('00006','Android基礎テキスト',2000);
SELECT * FROM bookinfo;
COMMIT;
SELECT * FROM bookinfo;





今度は処理が確定されています。 この状態で「ROLLBACK」をしてみましょう。
ROLLBACK;
SELECT * FROM bookinfo;





今度は処理が確定されていますので、新しく登録されたデータが残っているのが確認できます。

ページの先頭へ

2.本章のまとめ

本章ではトランザクション処理の概念と実行方法を学習しました。
トランザクション処理はデータの一貫性を保証する重要な概念ですが、考え方や実行方法自体はさほど難しいものではないので、本講座をよく読み込んで、理解を深めてください。

ページの先頭へ