3.7. Hot Rod Java クライアントトランザクション
JTA の トランザクション で Hot Rod クライアントを設定および使用できます。
トランザクションに参加するために、Hot Rod クライアントは、相互作用する TransactionManager と、Synchronization インターフェイスまたは XAResource インターフェイスを通じてトランザクションに参加するかどうかを要求します。
トランザクションは、クライアントが準備フェーズでエントリーへの書き込みロックを取得するという点で最適化されます。データの不整合を回避するには、トランザクションとの競合を検出 を必ずお読みください。
3.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>
Hot Rod トランザクションには、独自の復旧メカニズムがあります。
3.7.2. Hot Rod クライアントの設定
トランザクションの RemoteCache は、キャッシュごとに設定されます。例外は、単一のトランザクションが複数のRemoteCacheと対話できるため、グローバルなトランザクションの timeout
です。
以下の例は、キャッシュ 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);
設定パラメーターに関するドキュメントは、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
3.7.2.1. TransactionManagerLookup インターフェイス
TransactionManagerLookup
は、TransactionManager を取得するためのエントリーポイントを提供します。
TransactionManagerLookup の
の利用可能な実装:
- GenericTransactionManagerLookup
- Java EE アプリケーションサーバーで実行している TransactionManager を検索するルックアップクラス。TransactionManager が見つからなかった場合、デフォルトでは RemoteTransactionManager に設定されます。これは、Hot Rod Java クライアントのデフォルトです。
ほとんどの場合は、GenericTransactionManagerLookup が適しています。しかし、カスタム TransactionManager を統合する必要がある場合は、TransactionManagerLookup
インターフェイスを実装できます。
- RemoteTransactionManagerLookup
- 他の実装が利用できない場合は、基本および揮発性の TransactionManager です。この実装には、同時トランザクションと復元を処理するときに重大な制限があることに注意してください。
3.7.3. トランザクションモード
TransactionMode は RemoteCache が TransactionManager と相互作用する方法を制御します。
Data Grid サーバーとクライアントアプリケーションの両方でトランザクションモードを設定します。クライアントが非トランザクションキャッシュでトランザクション操作を実行しようとすると、ランタイム例外が発生する可能性があります。
トランザクションモードは、Data Grid 設定とクライアント設定の両方で同じです。クライアントで以下のモードを使用します。サーバーの Data Grid 設定スキーマを参照してください。
NONE
- RemoteCache は TransactionManager と対話しません。これはデフォルトのモードであり、非トランザクションです。
NON_XA
- RemoteCache は、同期 を介して TransactionManager と対話します。
NON_DURABLE_XA
- RemoteCache は、XAResource を介して TransactionManager と対話します。復元機能は無効になっています。
FULL_XA
-
RemoteCache は、XAResource を介して TransactionManager と対話します。復元機能が有効になっています。
XaResource.recover()
メソッドを呼び出して、リカバリーするトランザクションを取得します。
3.7.4. トランザクションとの競合の検出
トランザクションはキーの初期値を使用して競合を検出します。
たとえば、トランザクションの開始時に k の値は v となります。準備フェーズでは、トランザクションはサーバーから "k" を取得して値を読み取ります。値が変更された場合、トランザクションは競合を回避するためにロールバックします。
トランザクションはバージョンを使用して、値の等価性を確認する代わりに変更を検出します。
forceReturnValue
パラメーターは、RemoteCache への書き込み操作を制御し、競合を回避するのに役立ちます。次の値があります。
-
true
の場合、書き込み操作を実行する前に TransactionManager はサーバーから最新の値を取得します。ただし、forceReturnValue
パラメーターは、キーの初回アクセスの操作にのみ適用されます。 -
false
の場合、TransactionManager は書き込み操作を実行する前にサーバーから最新の値を取得しません。
このパラメーターは、最新の値が必要なため、replace
や putIfAbsent
などの 条件付き 書き込み操作には影響しません。
以下のトランザクションは、forceReturnValue
パラメーターが競合する書き込み操作を防ぐ例を提供します。
トランザクション 1 (TX1)
RemoteCache<String, String> cache = ... TransactionManager tm = ... tm.begin(); cache.put("k", "v1"); tm.commit();
トランザクション 2 (TX2)
RemoteCache<String, String> cache = ... TransactionManager tm = ... tm.begin(); cache.put("k", "v2"); tm.commit();
この例では、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();
トランザクション 2 (TX2)
RemoteCache<String, String> cache = ... TransactionManager tm = ... tm.begin(); cache.get("k"); cache.put("k", "v2"); tm.commit();
上記の例では、TX1 および TX2 の両方が鍵を読み取るため、forceReturnValue
パラメーターは有効になりません。1 つのトランザクションがコミットし、もう 1 つのトランザクションがロールバックします。ただし、cache.get()
操作には追加のサーバー要求が必要です。サーバーリクエストが非効率な cache.put()
オペレーションの戻り値が必要ない場合。
3.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();