JTAの概要

Novell exteNd Messaging PlatformのJTSは、JTA TransactionManagerおよびUserTransactionインタフェースの実装を備えています。 これらのインタフェースは、トランザクションマネージャおよびアプリケーションサーバ間のコントラクト、またトランザクションマネージャおよびJ2EEアプリケーションサーバのユーザアプリケーション間のコントラクトを表します。

UserTransactionを使用したトランザクションの開始

UserTransactionは、ユーザアプリケーションの上位トランザクションの管轄を備えています。
TransactionManagerを使用したトランザクションの開始
TransactionManagerは直接のトランザクション管理に対してより豊富な機能を備えたインタフェースであるため、使用がより困難である可能性があります。 このセクションでは、次の項目について説明します。

UserTransactionを使用したトランザクションの開始

UserTransactionは、ユーザアプリケーションおよびトランザクションマネージャ間のインタフェースです。 トランザクション管轄呼び出しのみを備えており、トランザクションでリソースを登録する手段は備えておらず、トランザクションの関連付けに対するスレッドを管理します。 アプリケーションコードは通常、アプリケーションサーバにより提供されるデータベースを使用して基礎のDBMSへの接続を取得します。一方で、アプリケーションサーバは必要なすべての呼び出しを実行して接続を現在のアクティブなトランザクションに関連付けます。 次に示す内容は、サーブレットや固有のトランザクションを管理するEJBセッションBeanなどUserTransactionがJ2EEアプリケーションで使用される方法を示すコードサンプルです。
UserTransaction ut;
DataSource  ds;
InitialContext ICl;

// get the JNDI InitialContext object
//
IC = new javax.naming.InitialContext();

// look up the UserTransaction and DataSource to DBMS
//
ut = (UserTransaction)IC.lookup("sssw://"+servPort+"/java:comp/UserTransaction");
ds = (DataSource)IC.lookup("lookup name for AppSever provided DataSource");

// Begin a transaction
ut.begin();

// Get a java.sql.Connection from DataSource
// The Application Server will ensure that this connection is properly
// enlisted in the transaction via the XAResource interface.
//
Connection conn = ds.getConnection();

// Make updates to the database  ...

conn.close();

// Commit the transaction
ut.commit();
 ?

TransactionManagerを使用したトランザクションの開始

TransactionManagerは、J2EEプラットフォームのアプリケーションサーバおよびトランザクションマネージャの間のインタフェースです。 トランザクションの管轄、トランザクションへのリソースの関連付けの管理、およびトランザクションへのスレッドの関連付けの管理を行います。

JTSがインスタンス化され、ORBのデフォルトトランザクションサービスとして設定、回復されると、アプリケーションのトランザクション管理に使用できます。 (詳細については、「サーバTMの作成」を参照してください)。
 

トランザクションでの1つまたは複数のXA対応リソースの関連付け

次に示す内容は、TransactionManagerオブジェクトへの参照の取得とトランザクションの開始方法を示すサンプルコードです。
 
import javax.transaction.TransactionManager;
import com.sssw.jts.api.TransactionService;

// JTS and ORB initialization ...
    ...

// Find initial reference to TransactionService object
   //
TransactionService ts = (TransactionService)
??? orb.resolve_initial_references("TransactionService");
TransactionManager tm = ts.getTransactionManager();
tm.begin();


次に示す内容は、アクティブなトランザクションにXA対応リソースを関連付ける方法を示すサンプルコードです。

import java.sql.*;
import javax.sql.*;

// Get a XAConnection from a XADataSource object.
//
XADataSource    xadsA = ...;  // A XA capable JDBC 2.0 DataSource
XAConnection    xaconnA;      // XAConnection from XADataSource
XAResource      xaresA;       //
Connection      connA;
Statement       statement;

xaconnA = XADataSource.getXAConnection();

// Get the XAResource and enlist it in the current transaction
//
xaresA = xaconnA.getXAResource();
tm.getTransaction().enlistResource(xaresA);

// Now get the Connection from XAConnection and do updates to database.
//
connA = XAConnection.getConnection();
statement = connA.createStatement();
statement.executeUpdate("INSERT INTO ...");
statement.close();
connA.close();

XA対応接続で現在のトランザクションに関連付けられている作業が完了すると、XAResourceはトランザクションのリストから削除されます。  リストから削除するには2つの方法があります。1つはXAResourceのトランザクションの関連付けを中断する方法、もう1つは関連付けを終了する方法です。  XAResourceの関連付けが中断された場合は、同じトランザクション内で再開できます。つまり、複数のデータベース更新をトランザクションに関連付けできます。  次に示す内容は、アクティブなトランザクションとのXAResourceの関連付けを終了する方法を示すサンプルコードです。
// Were done with updates using this connection...delist from Transaction
//
tm.getTransaction().delistResource(xaresA, XAResource.TMSUCCESS);
複数のリソースを現在のトランザクションに関連付けることができ、トランザクションに関連付けられたすべてのリソースですべての作業が完了すると、トランザクションはロールバックまたはコミットで完了できます。
 
// Commit the work in this transaction;
tm.commit();

スレッドの関連付けに対するトランザクションの管理

TransactionManagerインタフェースは、トランザクションの関連付けに対してスレッドを管理する機能を備えています。  スレッドでは1つのトランザクションのみをアクティブにでき、JTSではネストされたトランザクションをサポートしないという制限があります。

TransactionManager tm = ts.getTransactionManager();

// Start a transaciton ...
//
tm.begin();

// Do some work in this transaction
    ...

// Suspend the first transaction
Transaction firstTrans = tm.suspend();

// Start a second transaction
tm.begin();

// Do some work in this transaction
    ...

// Suspend the second transaction
Transaction secondTrans = tm.suspend();

// Resume and complete the first transaction
tm.resume(firstTrans);
tm.commit();

// Resume and complete the first transaction
tm.resume(secondTrans);
tm.commit();



Copyright © 1998-2003, Novell, Inc.All rights reserved.