3.8. Hot Rod Java クライアントトランザクション


JTA {tx} で Hot Rod クライアントを設定および使用できます。

トランザクションに参加するために、Hot Rod クライアントは、対話する {tm} と、{sync} または {xa} インターフェイスを介してトランザクションに参加するかどうかを要求します。

重要

トランザクションは、クライアントが準備フェーズでエントリーへの書き込みロックを取得するという点で最適化されます。データの不整合を回避するには、トランザクションとの競合を検出 を必ずお読みください。

3.8.1. サーバーの設定

クライアントが JTA トランザクション に参加するには、サーバーのキャッシュもトランザクションである必要があります。

次のサーバー設定が必要です。それ以外の場合、トランザクションはロールバックのみになります。

  • 分離レベルは REPEATABLE_READ である必要があります。
  • ロックモードは PESSIMISTIC である必要があります。今後のリリースでは、OPTIMISTIC ロックモードがサポートされます。
  • トランザクションモードは、NON_XA または NON_DURABLE_XA である必要があります。Hot Rod トランザクションはパフォーマンスが低下するため、FULL_XA を使用しないでください。

以下に例を示します。

<replicated-cache name="hotrodReplTx">
  <locking isolation="REPEATABLE_READ"/>
  <transaction mode="NON_XA" locking="PESSIMISTIC"/>
</replicated-cache>
Copy to Clipboard Toggle word wrap

Hot Rod トランザクションには、独自の復旧メカニズムがあります。

3.8.2. Hot Rod クライアントの設定

{rcm} の作成時に、{rc} が使用するデフォルトの {tm} および {tx-mode} を設定できます。

{rcm} を使用すると、以下の例のように、トランザクションキャッシュに設定を 1 つだけ作成できます。

org.infinispan.client.hotrod.configuration.ConfigurationBuilder cb = new org.infinispan.client.hotrod.configuration.ConfigurationBuilder();
//other client configuration parameters
cb.transaction().transactionManagerLookup(GenericTransactionManagerLookup.getInstance());
cb.transaction().transactionMode(TransactionMode.NON_XA);
cb.transaction().timeout(1, TimeUnit.MINUTES)
RemoteCacheManager rmc = new RemoteCacheManager(cb.build());
Copy to Clipboard Toggle word wrap

上記の設定は、リモートキャッシュのすべてのインスタンスに適用されます。異なる設定をリモートキャッシュインスタンスに適用する必要がある場合は、RemoteCache 設定をオーバーライドできます。リモートCacheManager 設定の上書き を参照してください。

設定パラメーターに関するドキュメントは、{cb} Javadoc を参照してください。

以下の例のように、プロパティーファイルを使用して Java Hot Rod クライアントを設定することもできます。

infinispan.client.hotrod.transaction.transaction_manager_lookup = org.infinispan.client.hotrod.transaction.lookup.GenericTransactionManagerLookup
infinispan.client.hotrod.transaction.transaction_mode = NON_XA
infinispan.client.hotrod.transaction.timeout = 60000
Copy to Clipboard Toggle word wrap

3.8.2.1. TransactionManagerLookup インターフェイス

TransactionManagerLookup は {tm} を取得するためのエントリーポイントを提供します。

TransactionManagerLookup の の利用可能な実装:

{gtml}
Java EE アプリケーションサーバーで実行している {tm} を見つけるルックアップクラス。{tm} が見つからない場合は、デフォルトで {rtm} に設定されます。これは、Hot Rod Java クライアントのデフォルトです。
ヒント

ほとんどの場合、{gtml} が適しています。しかし、カスタム TransactionManager を統合する必要がある場合は、TransactionManagerLookup インターフェイスを実装できます。

{rtml}
他の実装が利用できない場合は、基本および揮発性の {tm} です。この実装には、同時トランザクションと復元を処理するときに重大な制限があることに注意してください。

3.8.3. トランザクションモード

{tx-mode} は、{rc} が {tm} と相互作用する方法を制御します。

重要

Data Grid サーバーとクライアントアプリケーションの両方でトランザクションモードを設定します。クライアントが非トランザクションキャッシュでトランザクション操作を実行しようとすると、ランタイム例外が発生する可能性があります。

トランザクションモードは、Data Grid 設定とクライアント設定の両方で同じです。クライアントで以下のモードを使用します。サーバーの Data Grid 設定スキーマを参照してください。

NONE
{rc} は {tm} と相互作用しません。これはデフォルトのモードであり、非トランザクションです。
NON_XA
{rc} は、{sync} を介して {tm} と対話します。
NON_DURABLE_XA
{rc} は {xa} を介して {tm} と対話します。復元機能は無効になっています。
FULL_XA
{rc} は {xa} を介して {tm} と対話します。復元機能が有効になっています。XaResource.recover() メソッドを呼び出して、リカバリーするトランザクションを取得します。

3.8.4. キャッシュインスタンスの設定の上書き

{rcm} はキャッシュインスタンスごとに異なる設定をサポートしないため、ただし、{rcm} には、以下のように {rc} インスタンスを返し、一部の設定パラメーターを上書きすることができる getCache (String) メソッドが含まれています。

getCache(String cacheName, TransactionMode transactionMode)
{rc} を返し、設定された {tx-mode} をオーバーライドします。
getCache(String cacheName, boolean forceReturnValue, TransactionMode transactionMode)
以前と同じですが、書き込み操作の戻り値を強制することもできます。
getCache(String cacheName, TransactionManager transactionManager)
{rc} を返し、設定済みの {tm} を上書きします。
getCache(String cacheName, boolean forceReturnValue, TransactionManager transactionManager)
以前と同じですが、書き込み操作の戻り値を強制することもできます。
getCache(String cacheName, TransactionMode transactionMode, TransactionManager transactionManager)
{rc} を返し、設定済みの {tm} および {tx-mode} をオーバーライドします。transactionManager または transactionMode が null の場合、設定された値を使用します。
getCache(String cacheName, boolean forceReturnValue, TransactionMode transactionMode, TransactionManager transactionManager)
以前と同じですが、書き込み操作の戻り値を強制することもできます。
注記

getCache (String) メソッドは、トランザクションであるかどうかに関係なく、{rc} インスタンスを返します。{rc} には、キャッシュが使用する {tm} を返す getTransactionManager () メソッドが含まれています。{rc} がトランザクションではない場合、メソッドは null を返します。

3.8.5. トランザクションとの競合の検出

トランザクションはキーの初期値を使用して競合を検出します。

たとえば、トランザクションの開始時に k の値は v となります。準備フェーズでは、トランザクションはサーバーから "k" を取得して値を読み取ります。値が変更された場合、トランザクションは競合を回避するためにロールバックします。

注記

トランザクションはバージョンを使用して、値の等価性を確認する代わりに変更を検出します。

forceReturnValue パラメーターは、RemoteCache への書き込み操作を制御し、競合を回避するのに役立ちます。次の値があります。

  • true の場合、{tm} は書き込み操作を実行する前にサーバーから最新の値を取得します。ただし、forceReturnValue パラメーターは、キーの初回アクセスの操作にのみ適用されます。
  • false の場合、{tm} は書き込み操作を実行する前にサーバーから最新の値を取得しません。
注記

このパラメーターは、最新の値が必要なため、replaceputIfAbsent などの 条件付き 書き込み操作には影響しません。

以下のトランザクションは、forceReturnValue パラメーターが競合する書き込み操作を防ぐ例を提供します。

トランザクション 1 (TX1)

RemoteCache<String, String> cache = ...
TransactionManager tm = ...

tm.begin();
cache.put("k", "v1");
tm.commit();
Copy to Clipboard Toggle word wrap

トランザクション 2 (TX2)

RemoteCache<String, String> cache = ...
TransactionManager tm = ...

tm.begin();
cache.put("k", "v2");
tm.commit();
Copy to Clipboard Toggle word wrap

この例では、TX1 と TX2 が並行して実行されます。k の初期値は v です。

  • forceReturnValue = true の場合、cache.put() 操作はサーバーから TX1 と TX2 の両方のサーバーから k の値を取得します。最初に k のロックを取得するトランザクションはコミットします。他のトランザクションは、k が v 以外の値を持っていることをトランザクションが検出できるため、コミットフェーズ中にロールバックします。
  • forceReturnValue = false の場合 cache.put() オペレーションはサーバーから "k" の値を取得せず、null を返します。TX1 と TX2 の両方が正常にコミットされ、競合が生じます。これは、"k"の初期値が変更されたことをトランザクションが検知できないために発生します。

以下のトランザクションは、cache.put() オペレーションを行う前に K の値を読み取る cache.get() オペレーションが含まれます。

トランザクション 1 (TX1)

RemoteCache<String, String> cache = ...
TransactionManager tm = ...

tm.begin();
cache.get("k");
cache.put("k", "v1");
tm.commit();
Copy to Clipboard Toggle word wrap

トランザクション 2 (TX2)

RemoteCache<String, String> cache = ...
TransactionManager tm = ...

tm.begin();
cache.get("k");
cache.put("k", "v2");
tm.commit();
Copy to Clipboard Toggle word wrap

上記の例では、TX1 および TX2 の両方が鍵を読み取るため、forceReturnValue パラメーターは有効になりません。1 つのトランザクションがコミットし、もう 1 つのトランザクションがロールバックします。ただし、cache.get() 操作には追加のサーバー要求が必要です。サーバーリクエストが非効率な cache.put() オペレーションの戻り値が必要ない場合。

3.8.6. 設定済みトランザクションマネージャーおよびトランザクションモードの使用

以下の例は、RemoteCacheManager で設定した TransactionManager および TransactionMode を使用する方法を示しています。

//Configure the transaction manager and transaction mode.
org.infinispan.client.hotrod.configuration.ConfigurationBuilder cb = new org.infinispan.client.hotrod.configuration.ConfigurationBuilder();
cb.transaction().transactionManagerLookup(RemoteTransactionManagerLookup.getInstance());
cb.transaction().transactionMode(TransactionMode.NON_XA);

RemoteCacheManager rcm = new RemoteCacheManager(cb.build());

//The my-cache instance uses the RemoteCacheManager configuration.
RemoteCache<String, String> cache = rcm.getCache("my-cache");

//Return the transaction manager that the cache uses.
TransactionManager tm = cache.getTransactionManager();

//Perform a simple transaction.
tm.begin();
cache.put("k1", "v1");
System.out.println("K1 value is " + cache.get("k1"));
tm.commit();
Copy to Clipboard Toggle word wrap

3.8.7. トランザクションマネージャーの上書き

以下の例は、getCache メソッドで TransactionManager を上書きする方法を示しています。

//Configure the transaction manager and transaction mode.
org.infinispan.client.hotrod.configuration.ConfigurationBuilder cb = new org.infinispan.client.hotrod.configuration.ConfigurationBuilder();
cb.transaction().transactionManagerLookup(RemoteTransactionManagerLookup.getInstance());
cb.transaction().transactionMode(TransactionMode.NON_XA);

RemoteCacheManager rcm = new RemoteCacheManager(cb.build());

//Define a custom TransactionManager.
TransactionManager myCustomTM = ...

//Override the TransactionManager for the my-cache instance. Use the default configuration if null is returned.
RemoteCache<String, String> cache = rcm.getCache("my-cache", null, myCustomTM);

//Perform a simple transaction.
myCustomTM.begin();
cache.put("k1", "v1");
System.out.println("K1 value is " + cache.get("k1"));
myCustomTM.commit();
Copy to Clipboard Toggle word wrap

3.8.8. トランザクションモードの上書き

以下の例は、getCache メソッドで TransactionMode を上書きする方法を示しています。

//Configure the transaction manager and transaction mode.
org.infinispan.client.hotrod.configuration.ConfigurationBuilder cb = new org.infinispan.client.hotrod.configuration.ConfigurationBuilder();
cb.transaction().transactionManagerLookup(RemoteTransactionManagerLookup.getInstance());
cb.transaction().transactionMode(TransactionMode.NON_XA);

RemoteCacheManager rcm = new RemoteCacheManager(cb.build());

//Override the transaction mode for the my-cache instance.
RemoteCache<String, String> cache = rcm.getCache("my-cache", TransactionMode.NON_DURABLE_XA, null);

//Return the transaction manager that the cache uses.
TransactionManager tm = cache.getTransactionManager();

//Perform a simple transaction.
tm.begin();
cache.put("k1", "v1");
System.out.println("K1 value is " + cache.get("k1"));
tm.commit();
Copy to Clipboard Toggle word wrap
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat