4.5 トランザクション制御機能の使用方法
OpenTP1のトランザクション制御機能を使用する場合は,TP1Connectionオブジェクトを使用します。RPCインタフェースに次のどのインタフェースを使用した場合でも使用できます。
-
.NETインタフェース定義を使用した場合
-
サービス定義を使用した場合
-
インデクスドレコードを使用した場合
次の条件でトランザクション制御機能を使用した場合のコーディング例を示します。
-
サービスグループ名:GRP1
-
インタフェース名:MyCompany.IGyoumuB
-
呼び出すサービスメソッド名(サービス名):
PutData (DCRPC_CHAINED)
Invoke (DCNOFLAGS)
-
構成ファイル:指定あり(プロファイルID="TP1Host1")
-
クライアントスタブ:.NETインタフェース定義から生成
-
アプリケーション形態:ASP.NET XML Webサービス
-
RPC形態:連鎖RPC
- .NETインタフェース定義の定義例(C#の場合)
using System; namespace MyCompany { public interface IGyoumuB { void PutData(string clientId, string[] key, string[] data); int Invoke(string clientId, ref string result); } }
- 連鎖RPCでトランザクション機能を使用する場合のコーディング例(ASP.NET XML Webサービス,C#の場合)
using System; using Hitachi.OpenTP1; using Hitachi.OpenTP1.Connector; using MyCompany; namespace MyCompany { [WebService] public class MyWebService1 { … [WebMethod] private string Service(string[] key, string[] data) { string clientId = "MyWS_Service_" + seqNo.ToString(); string result = ""; TP1Connection tc = null; bool trnFlag = false; try { // グローバル変数のアプリケーション状態から // TP1ConnectionManagerを取得 TP1ConnectionManager tcm = (TP1ConnectionManager)this.Application["tcmTP1Host1"]; tc = tcm.GetConnection(); IGyoumuBStub server = new IGyoumuBStub(tc, "GRP1"); // トランザクション開始 tc.Begin(); trnFlag = true; // 連鎖RPC server.Flags = RpcInfo.DCRPC_CHAINED; // 最大応答待ち時間(60秒) server.WatchTime = 60; // PutDataの呼び出し(サーバにデータの書き込み) server.PutData(clientId, key, data); // 連鎖RPCの終了 server.Flags = RpcInfo.DCNOFLAGS; // 最大応答待ち時間(180秒) server.WatchTime = 180; // Invokeの呼び出し(処理要求) server.Invoke(clientId, ref result); // トランザクション終了 tc.Commit(); trnFlag = false; return result; } catch (TP1UserException exp) { // Service3()からユーザ例外がスローされた } catch (TP1RemoteException exp) { // Service3()で予期しない例外発生 } catch (TP1ConnectorException exp) { // Connector .NETが検知したエラー } catch (TP1Exception exp) { // その他スタブなどが検知したエラー } catch (Exception exp) { // 予期しない例外 } finally { try { // ロールバック if (trnFlag) tc.Rollback(); } catch (Exception) { // 無視 } // コネクションをコネクションプールに戻す if (tc != null) tc.Dispose(); } } } }