トランザクション管理とは?
この記事の動画版はこちら(画像クリックでYoutubeに飛びます)
トランザクション管理とは?
トランザクション管理とは、複数のSQL文を「1セット」として扱う機能です。
プログラムからデータベースに対して処理を行う際には、SQL文を使って行います。
例えば、「テーブルAに対してデータを登録する」「テーブルBに対してデータを登録する」といったようにそれぞれ個別のSQL文を実行しています。
実際のアプリケーション開発でも、1つの処理の中でいくつものSQL文を実行することがあります。
例えば、ネットショップのデータベースは一般的に
①商品を管理するための「商品テーブル」
②注文者の情報を管理するための「注文テーブル」
③注文の明細を管理するための「注文明細テーブル」
このようなテーブル構造になっています。
ネットショップで、ユーザーから注文が行われるとプログラムは次のような処理を行います。
①注文者の情報を「注文テーブル」に保存する。
②注文された商品、数量などの明細情報を「注文明細テーブル」に保存する。
③「商品テーブル」に登録されている該当商品の在庫を減らす。
このように、1つの処理の中で「3つのSQL文」を実行している訳ですが、万が一どれかの処理でエラー等が発生し、途中で止まってしまったらどうでしょう。
例えば、上の図のように3つ目のSQLだけエラーで実行されなかった場合、注文情報だけが登録され、商品の在庫は減らないというおかしな状態になってしまいます。
これでは、大きなトラブルにつながってしまいそうですね。
このように、各SQL文をバラバラに実行すると、万が一どこかでエラーが起こった場合、データの登録状態がおかしくなってしまい、整合性が取れなくなってしまう危険性があります。
このような事態を避けるために、一連のSQL文をセットで扱い、全て正常に完了したら全テーブルの変更を「確定」し、万が一途中でエラーが発生したら全テーブルの変更を「破棄」する。
このようなことを行える機能が「トランザクション管理」なんです。
トランザクション管理のやり方
トランザクション管理を行うには、これら3つの特別なSQL命令を使います。
START TRANSACTION
トランザクション管理を始めることを指示する。
COMMIT
実行した一連のSQL文を全て「確定」する。
ROLLBACK
実行した一連のSQL文を全て「破棄」する。
実際のやり方はこのような形です。
まず最初に「START TRANSACTION」を発行します。
> START TRANSACTION;
これで、以降発行されるSQL文は全てトランザクションの管理下となります。
続いて、処理のための一連のSQL文を発行します。
> INSERT INTO order_info..... // 注文テーブルに登録 > INSERT INTO order_detail..... // 注文明細テーブルに登録 > UPDATE product..... // 商品テーブルの在庫を更新
SQL文を全て発行し終わったら、最後に「COMMIT」を発行します。
> COMMIT;
この時点で、各テーブルへのデータ更新が確定されます。
もし、途中でエラーが発生した場合には、エラー処理の中で「ROLLBACK」を発行します。
ROLLBACK;
すると、各テーブルへのデータ更新が破棄され、全てなかったことにされます。
トランザクション管理は、このような流れで行います。
1つの処理の中で、複数のSQL文を発行するような場合は、万が一エラーが発生してもデータの整合性がおかしくならないようトランザクション管理を行うようにしましょう!