データベース千夜一夜第25回

トランザクションの管理(1)~トランザクションの基礎 長谷川裕行
有限会社 手國堂

トランザクション管理を試す

トランザクション管理を試してみましょう。

「商品ID=13518/オルゴール付き宝石箱(A)」の販売単価を100円引きにしてみます。テーブルが書き換えられるので、ここでは「商品_mr」と同じ内容を保持している「商品_dmy」を対象とします。


- フィールドの更新処理 -

「商品ID=13518/オルゴール付き宝石箱(A)」の販売単価は3,600円ですから、このSQL実行後には3,400円になっているはずです。
この処理は、これまでなら

  UPDATE 商品_dmy
  SET 販売単価=販売単価-100
  WHERE 商品ID = 13518

とするところですが、以下のように処理の直前でトランザクションを明示的に開始しましょう。   

  BEGIN TRANSACTION -------- トランザクションを開始
  UPDATE 商品_dmy
  SET 販売単価=販売単価-100
  WHERE 商品ID = 13518

「(1件処理されました。)」というメッセージが表示されます。ここまでは、通常のSQLの実行と変わりません。

ここでExterprise Managerを起動して、内容を書き換えたはずのテーブル「商品_dmy」を開いてみましょう(「全行を返す」を選択します)。しかし、空白のグリッドが表示されるだけで、テーブルの内容は確認できないはずです(画面2)。

これは、トランザクション管理によって対象レコードがロックされ、テーブルへの変更が確定されていないため、Exterprise Managerがその最新の内容を取得できないためです。一旦、この空白グリッドのウィンドウを閉じてください。



- 更新処理の取り消し -

続いて、クエリアナライザで以下の命令を実行します。

  ROLLBACK TRANSACTION

「コマンドは正常に終了しました。」と表示されます。この段階でトランザクションはロールバック(取り消し)されるため、「商品ID=13518/オルゴール付き宝石箱(A)」の販売単価は3,600円のまま変更されません。

Exterprise Managerで再度テーブルを開けば画面3のように内容が表示され、販売単価の書き換えられていないことが確認できます。確認したら、ウィンドウを閉じておきましょう。




- 更新処理の確定 -

今度は、処理を確定してみましょう。クエリアナライザで、先ほどと同じSQL(ex01.sql)を実行します。

  BEGIN TRANSACTION -------- トランザクションを開始
  UPDATE 商品_dmy
  SET 販売単価=販売単価-100
  WHERE 商品ID = 13518

先ほどと同じように、「(1件処理されました。)」というメッセージが表示されます。
続いて、以下の命令を実行します。

  COMMIT TRANSACTION

「コマンドは正常に終了しました。」と表示され、処理が確定します。Exterprise Managerでテーブルを開き、「商品ID=13518/オルゴール付き宝石箱(A)」の販売単価が100円引きの3,500円に書き換えられたことを確認してください。

このように、処理の前にBEGIN TRANSACTION命令を発行して明示的にトランザクションを開始すれば、後からその処理を確定するか(COMMIT命令)取り消すか(ROLLBACK命令)を制御できます。



あとがき

これまでに紹介したSQL命令とは異なり、トランザクションの管理はアプリケーションの仕様やシステム全体の構造と密接に関連しています。「この命令を発行すればああなる」といった単純な形ではなく、ユーザーがこうしたら……、エラーが返ってきたら……といった様々なケースを想定しながらシステム全体を設計していくことが重要です。

次回は、条件判断と分岐による柔軟なトランザクション管理など、実務に即したテクニックを紹介します。


Downloadサンプルファイル (LZH形式 0.40KB)



トップページ
トランザクションとその管理
処理の競合とタイミングの問題
トランザクション管理の実際
トランザクション管理を試す
フィールドの更新処理
更新処理の取り消し
更新処理の確定
あとがき
Copyright © MESCIUS inc. All rights reserved.