![]() |
![]() |
|
|
| |
WebLogic Tuxedo コネクタ ATMI トランザクション
次の節では、グローバル トランザクションの概要とそれらをアプリケーションで定義および管理する方法について説明します。
グローバル トランザクション
グローバル トランザクションは、2 つ以上のリソース マネージャのある作業、および 1 つの論理単位として扱われる 2 つ以上の物理サイトにまたがる作業を実行するトランザクションです。グローバル トランザクションは常に、次の 4 つのプロパティによって分類された特定のシーケンスの操作として扱われます。
JTA Transaction API
注意: 詳細については、JTA API を参照してください。
WebLogic Tuxedo コネクタは、トランザクションの管理に Java Transaction API(JTA)を使用します。
JTA インタフェースのタイプ
JTA には、3 つのタイプのトランザクション インタフェースがあります。
Transaction
Transaction
インタフェースは、ターゲット Transaction オブジェクトのトランザクションに対して実行されるオペレーションを許可します。トランザクション オブジェクトは、作成された各グローバル トランザクションに対応して作成されます。Transaction
インタフェースは、リソースの取得、登録の同期、およびトランザクション完了操作やステータス クエリ操作を実行するために使用します。
TransactionManager
TransactionManager
インタフェースによって、アプリケーション サーバはアプリケーションの代わりにトランザクション境界区分のトランザクション マネージャと通信できるようになります。TransactionManager
インタフェースは、コンテナ管理の EJB コンポーネントの代わりにトランザクション マネージャと通信するために使用します。
UserTransaction
UserTransaction
インタフェースは、TransactionManager
インタフェースのサブセットです。UserTransaction
インタフェースは、Transaction オブジェクトへのアクセスを制限する必要があるときに使用します。
JTA トランザクション プリミティブ
Tuxedo トランザクション プリミティブの機能を、等価の JTA トランザクション プリミティブにマップした表を次に示します。
トランザクションの定義
トランザクションは、クライアントまたはサーバ プロセスのいずれかで定義できます。 トランザクションは、3 つの部分で構成されます。3 つの部分とは、開始ポイント、トランザクション モードのプログラム文、および終了ポイントです。
トランザクションを明示的に定義するには、begin()
メソッドを呼び出します。呼び出しを行う同じプロセスであるイニシエータが、commit()
または setRollbackOnly()
を呼び出すことによって終了を行うプロセスにもなる必要があります。トランザクション区切り記号間で呼び出されるサービス サブルーチンは、現在のトランザクションの一部となります。
トランザクションの開始
注意: setTransactionTimeout()
をあまり大きい値に設定すると、システム検出やエラーのレポートが遅延します。タイムアウト値は、適切な時間内でサービス リクエストへの応答を行ったり、ネットワーク障害などの問題が発生したトランザクションを終了するために使用します。プロダクション環境では、システム ロードおよびデータベース競合によって起こると予想される遅延に対応するよう、タイムアウト値を調整します。
トランザクションは、begin()
への呼び出しによって開始されます。タイムアウト値を指定するには、begin()
文の前に setTransactionTimeout(
int seconds
)
文を指定します。
Tuxedo にトランザクションを伝播するには、次の操作を実行する必要があります。
TuxedoConnectionFactory
オブジェクトをルックアップします。
getTuxedoConnection()
を使用して TuxedoConnection
オブジェクトを取得します。
TPNOTRAN の使用
トランザクション区切り記号内で呼び出されるサービス ルーチンは、現在のトランザクションの一部となります。ただし、TPNOTRAN
に設定された flags パラメータが tpcall()
または tpacall()
に含まれている場合、呼び出されたサービスによって実行されるオペレーションは、そのトランザクションの一部にはなりません。結果として、呼び出されたプロセスによって実行されたサービスは、現在のトランザクションの結果からの影響を受けません。
トランザクションの終了
トランザクションは、commit()
または setRollbackOnly()
への呼び出しによって終了されます。commit()
が正常に返された場合、現在のトランザクションの結果としてのリソースに対する変更は、すべて永久なものとなります。setRollbackOnly()
は異常な状況を示し、呼び出し記述子を元の状態にロールバックするために使用します。
commit()
が正常に実行されるには、次の 2 つの条件が満たされている必要があります。
いずれかの条件が真でない場合、この呼び出しは失敗し、例外が送出されます。
WebLogic Tuxedo コネクタ トランザクションのルール
トランザクション モード中は、トランザクションを正常に完了させるために特定のルールに従う必要があります。トランザクション モード中に注意すべき基本的なルールは、次のとおりです。
begin()
でトランザクションを開始した「後」に、TuxedoConnection
オブジェクトを使用して Tuxedo にトランザクションを伝播する必要があります。
tpterm()
はオブジェクトへの接続を終了し、このオブジェクトでは今後操作を行わないようにします。
tpacall()
の flags パラメータが TPNOREPLY
に設定されている場合のみ実行できます。
commit()
を呼び出す前にすべての非同期トランザクション応答を取得する必要があります。
begin()
を呼び出す前にすべての非同期トランザクション応答を取得する必要があります。
tpacall()
で行われたリクエストに対して期待される応答)が含まれます。
TPNOTRAN
フラグ セットで実行する必要があります。
TPEBADDESC
を返します。
tpgetrply()
または tprecv()
への以後の呼び出しは、tperrono
を TPETIME
に設定することによってグローバルな状態のトランザクション タイムアウトを返します。
TPNOREPLY
| TPNOBLOCK
| TPNOTRAN
に設定された tpacall()
の flags パラメータによって実行されます。
tpgetrply()
への呼び出しは、その呼び出しのローカルな状態を示すものはすべて返します。つまり、ローカルな状態を示す成功コードまたはエラー コードのいずれかを返すことができます。
tpgetrply()
で応答を取得するために使用された記述子は無効になり、それ以後の参照では TPEBADDESC
が返されます。
tpsend()
または tprecv()
でエラー状態を報告するために使用された記述子は無効になり、それ以後の参照では TPEV_DISCONIMM
が返されます。
TPNOTRAN
フラグなしで実行)が停滞状態となり、それらに対する今後の参照では TPEBADDESC
が返されます。
トランザクション コードの例
次に、トランザクションのコード例を示します。
コード リスト 5-1 トランザクション コードの例
public class TransactionSampleBean implements SessionBean {
.....
public int transaction_sample () {
int ret = 0;
try {
javax.naming.Context myContext = new InitialContext();
TransactionManager tm = (javax.transaction.TransactionManager)
myContext.lookup("javax.transaction.TransactionManager");// トランザクションを開始する
tm.begin ();TuxedoConnectionFactory tuxConFactory = (TuxedoConnectionFactory)
ctxt.lookup("tuxedo.services.TuxedoConnection");// このトランザクションの一部になるローカルの
// JDBC/XA データベース処理をここで実行できる
.....// 注意 1: Tuxedo の呼び出しをトランザクションの一部
// にする必要がある場合は、Tuxedo 接続をトランザクション
// の開始後にのみ取得する// 注意 2: トランザクションの開始前に Tuxedo
// 接続を取得すると、その Tuxedo 接続からの
// すべての呼び出しがトランザクションのスコープ外
// になるTuxedoConnection myTux = tuxConFactory.getTuxedoConnection();
// tpcall を実行する。この tpcall はトランザクションの一部
TypedString depositData = new TypedString("somecharacters,5000.00");Reply depositReply = myTux.tpcall("DEPOSIT", depositData, 0);
// TPNOTRAN フラグを設定することによって、トランザクション
// の一部ではない tpcall を実行することもできる(たとえば
// 試行されたすべての処理のロギングなど)
TypedString logData =
new TypedString("DEPOSIT:somecharacters,5000.00");Reply logReply = myTux.tpcall("LOGTRAN", logData,
ApplicationToMonitorInterface.TPNOTRAN);// Tuxedo 接続が用済みになり、tpterm を実行する
myTux.tpterm ();// Transaction をコミットする
tm.commit ();// 注意: このトランザクションで使用されている TuxedoConnection
// オブジェクトは、TPNOTRAN フラグが設定されている場合のみ
// トランザクション後も使用できる
}
catch (NamingException ne) {
System.out.println ("ERROR: Naming Exception looking up JNDI: " + ne);
ret = -1;
}
catch (RollbackException re) {
System.out.println("ERROR: TRANSACTION ROLLED BACK: " + re);
ret = 0;
}
catch (TPException te) {
System.out.println("ERROR: tpcall failed: TpException: " + te);
ret = -1;
}
catch (Exception e) {
log ("ERROR: Exception: " + e);
ret = -1;
}return ret;
}
![]() |
![]() |
![]() |