Forguncy 10 オンラインヘルプ
アプリの開発 / 外部連携と入出力 / 外部データベース / 外部データベースの同時実行制御
このトピックで
    外部データベースの同時実行制御
    このトピックで

    SQL Server、Oracle Database、MySQL、PostgreSQLの場合、レコードの更新時に楽観的同時実行制御(楽観的ロック)を行うようにすることが可能です。ODBCデータソースでは、同時実行制御はサポートされていません。

    この同時実行制御が行われるのは以下の場合のみとなり、それ以外の場合には同時実行制御は行われません。

    上記の場合において同時実行制御が働いた場合、以下のようなメッセージが表示され、更新処理はキャンセルされます。

    SQL Server

    更新対象のテーブルにrowversionデータ型の列が含まれている場合、Forguncyはその列を使用して同時実行制御を行います。

    Oracle Database

    同時実行制御を有効化するためには、いくつかの条件とデータベース側での設定が必要です。

    以下のようなトリガーを作成し、更新対象のテーブルに最終の更新日時が格納されるTIMESTAMP型の列を用意します。なお、Oracle DatabaseのTIMESTAMP型は既定では秒の小数部は6桁となりますが、任意の桁数を指定可能です。必要に応じてより高い精度の桁数を指定してください。

    作成するトリガーの一例
    コードのコピー
    CREATE OR REPLACE TRIGGER trigger_testRowversion
    BEFORE UPDATE
       ON TABLE1
      FOR EACH ROW
    BEGIN
      :new."rowversion" := current_timestamp;
    END trigger_testRowversion; 

    作成した列(上記の場合「ROWVERSION」)を[行のバージョン管理フィールド]として設定します。このように設定することで、Forguncyはその列を使用して同時実行制御を行います。

    MySQL

    [行バージョン管理フィールド]プロパティは既定で「自動」に設定されます。「自動」の場合、Forguncyが自動作成したFGC_Rowversionが存在すればそのフィールドを使用します。FGC_Rowversionについては構造変更の許可を参照してください。FGC_Rowversionが存在しない場合、最初に見つかったtimestamp型のフィールドを使用して同時実行制御を行います。

    [行バージョン管理フィールド]プロパティには、任意のtimestamp型フィールドを選択できます。その際、レコードの値が変更された際にタイムスタンプが自動更新されるようにON UPDATE CURRENT_TIMESTAMP句が使用されている必要があることに注意してください。また、timestamp型の定義がtimestamp(6)などのようにミリ秒やマイクロ秒といた精度の値が保持されるようになっていない場合、精度の高い同時実行制御は行われません。

    PostgreSQL

    同時実行制御を有効化するためには、いくつかの条件とデータベース側での設定が必要です。

    以下のようなトリガーを作成し、更新対象のテーブルに最終の更新日時が格納されるtimestamp型の列を用意します。

    作成するトリガーの一例
    コードのコピー
    CREATE OR REPLACE FUNCTION "public"."trigger_testRowversion_fun"()
      RETURNS "pg_catalog"."trigger" AS $BODY$
    begin
      NEW.last_date := current_timestamp;
      RETURN NEW;
    end;
    $BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100
     
    CREATE TRIGGER trigger_testRowversion BEFORE INSERT OR UPDATE ON table1
        FOR EACH ROW EXECUTE PROCEDURE "public"."trigger_testRowversion_fun"();

    作成した列(上記の場合「last_date」)を[行のバージョン管理フィールド]として設定します。このように設定することで、Forguncyはその列を使用して同時実行制御を行います。

    ODBCデータソース

    同時実行制御は行われません。以下の方法を用いて、手動で同時実行制御を実装することを検討してください。なお、この手動による同時実行制御は「テーブルデータの更新」コマンドを使用してレコードの更新を行う場合にのみ有効です。リストビューの[編集を許可]オプションを使用してレコードの更新を行う場合には、同時実行制御は行われませんので、注意してください。

    1. 同時実行制御を行いたいテーブルに任意の名称の文字データ型の列を1つ追加します。格納するデータは36桁の英数字(ハイフン含む)となりますので、このデータが格納できるサイズで作成してください。ここでは列名を「行バージョン」とします。

    2. レコードの更新を行うページの任意のセルに、「行バージョン」とデータ連結を設定します。通常、この「行バージョン」のデータはページに表示する必要がないため、列の非表示か行の非表示の機能を使用して、表示されないように設定します。

    3. レコードの更新を行う部分で、「条件分岐」コマンドを1つ追加し、以下のような条件を設定します。

    4. 3の条件が合致した場合に実行するコマンドとして、以下のような設定の「テーブルデータの更新」コマンドを設定します。「%GUID%」キーワードは、GUIDを返すForguncyが持つ特別なキーワードです。GUIDは128ビットの整数値からなる、データを一意に識別するために用いられる識別子です。

    5. 3の条件が合致しなかった場合に実行するコマンドとして、以下のような設定の「メッセージの表示」コマンドを設定します。メッセージ内容は任意のもので構いません。