4D v16.3トランザクションの停止 |
||
|
4D v16.3
トランザクションの停止
トランザクションの停止
トランザクションの一時停止は、トランザクションの管理下で実行される必要のない特定の操作を、トランザクション内から実行する必要があるときに有用です。例えば、顧客がオーダーのためにトランザクションを開始し、ついでに住所を更新した場合を考えましょう。しかし、顧客の気が変わってオーダーをキャンセルしたとします。トランザクションはキャンセルされますが、住所の変更まではキャンセルしたくありません。これはトランザクションの一時停止が有用である良い例です。トランザクションの停止・再開には、三つのコマンドが使用されます:
ここでは停止されたトランザクションの必要性について考えます。請求書データベースにおいて、トランザクション中に新しい請求書番号が必要になったとします。この番号は計算され、[Settings]テーブルに保存されます。マルチユーザー環境において、並行のアクセスは保護されなければなりませんが、メインのトランザクションとは無関係なデータにも関わらず、トランザクションの影響で [Setting] テーブルが他のユーザーによってロックされてしまう可能性があります。この場合、テーブルにアクセスする際にトランザクションを停止すておくことができます。 //請求書を作成する標準のメソッド GetInvoiceNumメソッドは実行前にトランザクションを一時停止させます。このコードは、トランザクション外からメソッドが呼び出された場合でも動作するという点に注意して下さい: //GetInvoiceNum プロジェクトメソッド トランザクションの停止中においては、以下の原理が採用されます:
これらの原理をまとめると、以下の図のようになります: トランザクションAで編集された値 (レコードID1にVal11が入る) は A の "停止中" に開始された新しいトランザクションBでは利用できません。"停止中" に編集された値 (レコードID2にVal22が入り、レコードID3にはVal33が入る) はトランザクションAがキャンセルされても、保存されたままです。 エラーを管理するために、特定の機能が追加されました:
既存の In transaction コマンドはトランザクションが開始されていれば、停止中であってもTrueを返します。カレントトランザクションが停止中であるかどうかを調べるためには、新しいTransaction activeコマンドを使用する必要があります。こちらはこういった場合にはFalseを返します。 しかし、開始されているトランザクションが存在しない場合には、どちらのコマンドも False を返します。この場合には既存の Transaction level コマンドを使用する必要があるかもしれません。こちらはこの場合に 0 (開始されているトランザクションはない) を返します。 以下の図は、様々なトランザクションのコンテキストと、トランザクションコマンドによって返される値の対応をまとめたものです:
参照
|
プロパティ
プロダクト: 4D
履歴
初出: 4D v15 R4 ARTICLE USAGE
ランゲージリファレンス ( 4D v16) |