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


JTA の トランザクション で Hot Rod クライアントを設定および使用できます。

トランザクションに参加するために、Hot Rod クライアントは、相互作用する TransactionManager と、Synchronization インターフェイスまたは XAResource インターフェイスを通じてトランザクションに参加するかどうかを要求します。

重要

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

4.7.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 トランザクションには、独自の復旧メカニズムがあります。

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

トランザクションの RemoteCache は、キャッシュごとに設定されます。例外は、グローバルなトランザクションの timeout です。これは、単一のトランザクションが複数の RemoteCache と対話できるためです。

注記

ペシミスティックロックは、組み込み Data Grid によってサポートされますが、Hot Rod クライアントによってはサポートされません。したがって、Data Grid サーバーでペシミスティックロックを使用して取得されたトランザクション結果は、Hot Rod クライアントから取得された結果と異なる可能性があります。

以下の例は、キャッシュ my-cache にトランザクションの RemoteCache を設定する方法を示しています。

org.infinispan.client.hotrod.configuration.ConfigurationBuilder cb = new org.infinispan.client.hotrod.configuration.ConfigurationBuilder();
//other client configuration parameters
cb.transactionTimeout(1, TimeUnit.MINUTES);
cb.remoteCache("my-cache")
   .transactionManagerLookup(GenericTransactionManagerLookup.getInstance())
   .transactionMode(TransactionMode.NON_XA);
Copy to Clipboard Toggle word wrap

設定パラメーターの詳細は、ConfigurationBuilder および RemoteCacheConfigurationBuilder Javadoc のドキュメントを参照してください。

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

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

4.7.2.1. TransactionManagerLookup インターフェイス

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

TransactionManagerLookup の利用可能な実装:

GenericTransactionManagerLookup
Java EE アプリケーションサーバーで実行している TransactionManager を検索するルックアップクラス。TransactionManager が見つからない場合、デフォルトは RemoteTransactionManager になります。これは、Hot Rod Java クライアントのデフォルトです。
ヒント

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

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

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

TransactionMode は、RemoteCacheTransactionManager と対話する方法を制御します。

重要

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

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

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

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

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

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

注記

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

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

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

このパラメーターは、最新の値が必要なため、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() オペレーションの戻り値が必要ない場合。

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

以下の例は、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.remoteCache("my-cache")
    .transactionManagerLookup(RemoteTransactionManagerLookup.getInstance())
    .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
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

Theme

© 2025 Red Hat