Novell exteNd Messaging PlatformのJTSは、JTATransactionManager
およびUserTransaction
インタフェースの実装を備えています。 これらのインタフェースは、トランザクションマネージャおよびアプリケーションサーバ間のコントラクト、またトランザクションマネージャおよびJ2EEアプリケーションサーバのユーザアプリケーション間のコントラクトを表します。UserTransactionを使用したトランザクションの開始
UserTransactionは、ユーザアプリケーションの上位トランザクションの管轄を備えています。TransactionManagerを使用したトランザクションの開始TransactionManagerは直接のトランザクション管理に対してより豊富な機能を備えたインタフェースであるため、使用がより困難である可能性があります。 このセクションでは、次の項目について説明します。
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は、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.*;XA対応接続で現在のトランザクションに関連付けられている作業が完了すると、XAResourceはトランザクションのリストから削除されます。 リストから削除するには2つの方法があります。1つはXAResourceのトランザクションの関連付けを中断する方法、もう1つは関連付けを終了する方法です。 XAResourceの関連付けが中断された場合は、同じトランザクション内で再開できます。つまり、複数のデータベース更新をトランザクションに関連付けできます。 次に示す内容は、アクティブなトランザクションとのXAResourceの関連付けを終了する方法を示すサンプルコードです。
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();// 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();