Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 プログラム作成の手引


5.2.2 TX_関数の使用方法

〈この項の構成〉

(1) トランザクションの開始

TX_関数でトランザクションを開始させるときは,UAPからは次のように関数を呼び出してください。この順で関数を呼び出すと,ユーザサービス定義のatomic_updateオペランドの指定に関係なく,トランザクションを開始できます。また,ユーザサービス定義でatomic_updateオペランドにYを指定していれば,tx_open()【TXOPEN】tx_close()【TXCLOSE】を呼び出さなくても,トランザクション処理を開始できます。

SUPでトランザクションを開始する場合
dc_rpc_open()
tx_open()
tx_begin()
      :
      :
tx_commit()(同期点処理)
tx_close()
      :   …この間で,再びtx_open()とtx_close()を呼び出せます。
dc_rpc_close()
SPPでトランザクションを開始する場合

(サービス関数でトランザクションを開始)

dc_rpc_open()
tx_open()
dc_rpc_mainloop()
      :
(サービス関数の処理)
tx_begin()
      :
      :
tx_commit()(同期点処理)
      :
(メイン関数のdc_rpc_mainloop()リターン)
tx_close()
      : 
dc_rpc_close()

SPPのサービス関数内でトランザクションを開始させる場合には,dc_rpc_mainloop関数を呼び出す前に,tx_open()を呼び出してください。

(2) 同期点の取得

tx_begin()【TXBEGIN】で開始したトランザクション処理は,同期点を取得する関数(tx_commit()【TXCOMMIT】,またはtx_rollback()【TXROLLBACK】)で必ず完了させてください。

tx_commit()とtx_rollback()には,連鎖モード(TX_CHAINED)と非連鎖モード(TX_UNCHAINED)があります。同期点の取得後に新しいグローバルトランザクションを開始する場合は連鎖モード,開始しないでトランザクション処理を終了させる場合は非連鎖モードを設定します。連鎖モード/非連鎖モードはtransaction_control特性として設定します。transaction_control特性は,tx_set_transaction_control()【TXSETTRANCTL】で設定します。

(3) トランザクション特性の設定

TX_関数を呼び出すことで,トランザクション処理の特性を設定できます。

(a) commit_return特性

トランザクションを2相コミットするときに,1相目が完了したときにリターンするか,または2相目まで完了してからリターンするかを設定できます。ただし,OpenTP1の該当バージョンでは2相目まで完了しないうちにリターンする設定はできません。設定した場合はエラーリターンします。commit_return特性は,tx_set_commit_return()【TXSETCOMMITRET】で設定します。

(b) transaction_control特性

同期点(tx_commit(),tx_rollback())のあとで,新しいトランザクションを開始させるかどうか(連鎖モードか非連鎖モードか)を設定します。transaction_control特性は,tx_set_transaction_control()【TXSETTRANCTL】で,TX_CHAINEDまたはTX_UNCHAINEDのどちらかを設定します。

(c) transaction_timeout特性

トランザクションの監視時間を設定できます。transaction_timeout特性は,tx_set_transaction_timeout()【TXSETTIMEOUT】で設定します。システム定義のtrn_expiration_timeの値よりも,tx_set_transaction_timeout()で設定したtransaction_timeout特性が優先されます。

(4) トランザクションの情報取得

tx_info()【TXINFORM】で,トランザクションブランチIDや,トランザクション特性を格納されている構造体を参照できます。

参照できる構造体の形式を次に示します。

XID                  xid;
COMMIT_RETURN        when_return;
TRANSACTION_CONTROL  transaction_control;
TRANSACTION_TIMEOUT  transaction_timeout;
TRANSACTION_STATE    transaction_state;

(5) ユーザサービス定義との関連

tx_open(),tx_close()を使うと,ユーザサービス定義のatomic_updateオペランドの値に関係なく,tx_begin()以降の処理をトランザクションとして処理できます。

ただし,tx_begin()を呼び出したUAPからのサービス要求先でトランザクションとして処理する場合は,呼び出し先のサーバUAPのatomic_updateオペランドにYを指定してください。