161 DBMS_SAGA

DBMS_SAGAパッケージは、sagaを開始およびファイナライズするためのsagaファンクションおよびプロシージャのコレクションを提供します。

この章のトピックは、次のとおりです:

161.1 DBMS_SAGAの概要

DBMS_SAGAパッケージを使用すると、(開発者は)中間層を必要とせずに、PL/SQLを使用してデータベース内のパッケージ化されたマイクロサービス・アプリケーションを開発できます。

DBMS_SAGAパッケージは、クライアント・プログラムがデータベースsagaと対話できるようにするためのPL/SQLインタフェースを提供します。

中間層を使用してデータベースと通信するマイクロサービスを実装する場合は、AQJMS拡張を使用してsaga機能を実装することをお薦めします。

参照:

AQJMS拡張の詳細は、「JMSインタフェースを使用したSagaの管理」を参照してください。

161.2 DBMS_SAGAのセキュリティ・モデル

DBMS_SAGAパッケージを使用するには、sagaに参加するためのSAGA_PARTICPANTロールが必要です。

161.3 DBMS_SAGAサブプログラムの要約

この表では、DBMS_SAGAパッケージのサブプログラムをリストし、簡単に説明します。

表161-1 DBMS_SAGAパッケージのサブプログラム

サブプログラム 説明

BEGIN_SAGAファンクション

新しいsaga_id_t (GUID)を作成して戻します。新しいSaga IDは、Saga$ディクショナリ表に挿入されます。

GET_SAGA_IDファンクション データベース・セッションに関連付けられたSagaのSaga IDを取得します。
SET_SAGA_IDプロシージャ データベース・セッションのSaga IDを、指定されたsaga_idに設定します。
COMMIT_SAGAプロシージャ saga_idパラメータで識別されるSagaをコミットします。
ROLLBACK_SAGAプロシージャ saga_idパラメータで識別されるSagaをロールバックします。
IS_INCOMPLETEファンクション 指定されたsaga_idに対応するSagaが未完了とみなされた場合にTRUEを戻します。
SET_INCOMPLETEプロシージャ 指定されたsaga_idで識別されるSagaを未完了としてマークします。
SEND_REQUESTプロシージャ 開始されたSagaへの参加者を登録します。

161.3.1 BEGIN_SAGAファンクション

このファンクションは、新しいsaga GUID: saga_id_tを作成して戻します。新しいsaga IDは、saga$ディクショナリ表に挿入されます。

構文

function begin_saga(initiator_name IN varchar2,
          timeout   IN number default NULL,
          version   IN number default 1) 
 return saga_id_t;

パラメータ

表161-2 BEGIN_SAGAプロシージャのパラメータ

パラメータ 説明

initiator_name

sagaイニシエータの名前。

timeout

タイムアウト値を秒数で指定します。この値は、max_saga_durationパラメータの値をオーバーライドします。

161.3.2 GET_SAGA_IDファンクション

このファンクションは、現在のデータベース・セッションに関連付けられているsaga (ある場合)を戻します。

構文

function get_saga_id() return saga_id_t;

161.3.3 SET_SAGA_IDプロシージャ

このプロシージャは、データベース・セッションのsaga IDを指定されたsaga_idに設定します。

構文

procedure set_saga_id(saga_id  IN saga_id_t);

パラメータ

表161-3 SET_SAGAプロシージャのパラメータ

パラメータ 説明

saga_id

タイプsaga_id_tのsaga識別子。

161.3.4 COMMIT_SAGAプロシージャ

このプロシージャは、saga_idパラメータで識別されるsagaをコミットします。

forceオプションは、保留中または未完了のsagaに対してsaga参加者トランザクションを強制的にコミットするために使用されます。参加者データベースに対するCOMMIT_SAGA()コールの場合、force=TRUEは参加者データベースのsagaブランチ操作をコミットするのみです。forceのデフォルト値はTRUEです。

構文

procedure commit_saga(saga_participant IN VARCHAR2,
 saga_id IN saga_id_t,
 force   IN BOOLEAN DEFAULT FALSE);

パラメータ

表161-4 COMMIT_SAGAプロシージャのパラメータ

パラメータ 説明

saga_participant

saga参加者(participant_name)。

saga_id

タイプsaga_id_tのsaga識別子。

force

sagaのコミット操作がsagaブランチに対して開始されるかどうかを示すフラグ。

161.3.5 ROLLBACK_SAGAプロシージャ

このプロシージャは、saga_idパラメータに対応するsagaを中断します。

forceオプションを使用すると、保留中または未完了のsagaに対してsaga参加者トランザクションを強制的にロールバックできます。参加者データベースに対するROLLBACK_SAGA()コールの場合、force=TRUEは参加者データベースのsagaブランチ操作をロールバックするのみです。forceのデフォルト値はTRUEです。

構文

procedure rollback_saga (saga_participant IN VARCHAR2,
 saga_id IN saga_id_t,
 force   IN BOOLEAN DEFAULT FALSE);

パラメータ

表161-5 ROLLBACK_SAGAプロシージャのパラメータ

パラメータ 説明

saga_participant

saga参加者(participant_name)。

saga_id

タイプsaga_id_tのsaga識別子。

force

ロールバックsaga操作が参加者データベースに対して開始されるかどうかを示すフラグ。デフォルト値はTRUEです。

161.3.6 IS_INCOMPLETEファンクション

このファンクションは、指定されたsaga_idに対応するsagaが未完了とみなされた場合にTRUEを戻します。

sagaは、次の理由により未完了とみなされます。

  • sagaがmax_saga_durationパラメータで識別される期間またはbegin_saga()コールによって設定された期間を超える場合。
  • sagaの参加者がsaga (コミットまたはロールバック)をファイナライズできない場合。

構文

function is_incomplete (saga_id  IN saga_id_t)    returns boolean;

パラメータ

表161-6 IS_COMPLETEファンクションのパラメータ

パラメータ 説明

saga_id

タイプsaga_id_tのsaga識別子。

161.3.7 SET_INCOMPLETEプロシージャ

このプロシージャは、指定されたsaga_idパラメータに対応するsagaを未完了としてマークします。

これは、特定のsagaを未完了としてマークして、これらのsagaに手動操作のフラグを付けることができるようにする管理インタフェースです。

構文

procedure set_incomplete (saga_id  IN saga_id_t);

パラメータ

表161-7 SET_INCOMPLETEプロシージャのパラメータ

パラメータ 説明

saga_id

タイプsaga_id_tのsaga識別子。

161.3.8 SEND_REQUESTプロシージャ

このプロシージャは、開始されたsagaへの参加者を登録するためにクライアントが使用できます。

このプロシージャは、sagaメッセージの作成、JSONペイロードの変換および参加者へのメッセージのエンキューを抽象化します。アプリケーション開発者はこのステップも手動で実行することもできます。

構文

procedure send_request(saga_id IN saga_id_t,
 recipient    IN VARCHAR2,
 payload      IN JSON DEFAULT NULL,
 saga_version IN NUMBER DEFAULT 1,
 saga_spare   IN VARCHAR2 DEFAULT NULL);

パラメータ

表161-8 SEND_REQUESTプロシージャのパラメータ

パラメータ 説明

saga_id

BEGIN_SAGA()ファンクションを使用して導出されるsaga識別子。

recipient

このsagaに登録する参加者。

payload

登録する参加者のrequest()をコールするJSONペイロード。

saga_version

sagaフレームワークのバージョン(デフォルトは1)。

saga_spare

現在使用されていないフィールド。