SQL入門 第7回 トランザクションについて

前回は「ビューについて」というテーマでビューの概念についてとビューの作成方法、ビューの取得方法についての説明を行いました。

今回は「トランザクションについて」というテーマで解説をしていきます。

※今回は練習問題がありません

トランザクションとは

トランザクションは直訳すると「処理」になります。
よく「トランザクション処理」という言葉の使い方をしますが、「処理処理」という意味になってしまいますね(笑)

そんなことはどうでもよくって、

トランザクション処理とは、

DB操作を行うときの処理の単位を、テーブル間で不整合が起きないように制御する処理のことを言います。

例えば、以下のように普通預金口座テーブルと当座預金口座テーブルがあったとします。

Aさんが普通預金口座から当座預金口座へ、5,000円移動する手続きを実行したとします。この時実行するSQLは以下の2つになります。

UPDATE
    普通預金口座
SET
    金額 = 金額 - 5000
WHERE
    口座名義 = 'Aさん'
UPDATE
    当座預金口座
SET
    金額 = 金額 + 5000
WHERE
    口座名義 = 'Aさん'

このように、普通預金口座の金額を5,000円分減らす処理と、当座預金口座の金額を5,000増やす処理を行う必要があります。

が、仮にどちらか一方が失敗してしまうと、Aさんの資産が5,000円多くなってしまったり、少なくなってしまったりと、不整合が発生してしまいます。

そこで、トランザクション処理をしようして、不整合が起こらないようにするのです。具体的には、以下のように記述します。

BEGIN TRY 

    BEGIN TRANSACTION

    --普通預金口座の更新(この行はコメントです)

    UPDATE
        普通預金口座
    SET
        金額 = 金額 - 5000
    WHERE
        口座名義 = 'Aさん'

    --当座預金口座の更新(この行はコメントです)

    UPDATE
        当座預金口座
    SET
        金額 = 金額 + 5000
    WHERE
        口座名義 = 'Aさん'

END TRY
BEGIN CATCH
    ROLLBACK
END CATCH

    COMMIT

BEGIN TRANSACTION」がトランザクション処理の開始、その後書かれたSQLのクエリは「COMMIT」が実行されるまでDBに反映されません。エラーになることなく一番下の行まで処理できればCOMMITされて綺麗にテーブルが更新されます。

万が一処理が失敗したら、try catch構文によってcatchされて、「ROLLBACK」されます。

ROLLBACKされると、DBの状態はBEGIN TRANSACTIONを実行したときの状態に戻ります。


このように、整合性が保たれる単位でトランザクションをコミットするように制御する設計は、プログラム設計においては、とても重要な事項になりますので、かならず押さえておくようにしましょう。

第7回「トランザクションについて」は以上になります。

次回第8回は、「データベースの正規化」についてです。