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>
<replicated-cache name="hotrodReplTx">
<locking isolation="REPEATABLE_READ"/>
<transaction mode="NON_XA" locking="PESSIMISTIC"/>
</replicated-cache>
Hot Rod トランザクションには、独自の復旧メカニズムがあります。
4.7.2. Hot Rod クライアントの設定 リンクのコピーリンクがクリップボードにコピーされました!
トランザクションの RemoteCache は、キャッシュごとに設定されます。例外は、単一のトランザクションが複数の RemoteCache と対話できるため、グローバルなトランザクションの timeout です。
以下の例は、キャッシュ my-cache にトランザクション RemoteCache を設定する方法を示しています。
設定パラメーターに関するドキュメントは、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
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
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 は RemoteCache が TransactionManager と相互作用する方法を制御します。
Data Grid サーバーとクライアントアプリケーションの両方でトランザクションモードを設定します。クライアントが非トランザクションキャッシュでトランザクション操作を実行しようとすると、ランタイム例外が発生する可能性があります。
トランザクションモードは、Data Grid 設定とクライアント設定の両方で同じです。クライアントで以下のモードを使用します。サーバーの Data Grid 設定スキーマを参照してください。
NONE- RemoteCache は TransactionManager と対話しません。これはデフォルトのモードであり、非トランザクションです。
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 は書き込み操作を実行する前にサーバーから最新の値を取得しません。
このパラメーターは、最新の値が必要なため、replace や putIfAbsent などの 条件付き 書き込み操作には影響しません。
以下のトランザクションは、forceReturnValue パラメーターが競合する書き込み操作を防ぐ例を提供します。
トランザクション 1 (TX1)
トランザクション 2 (TX2)
この例では、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)
トランザクション 2 (TX2)
上記の例では、TX1 および TX2 の両方が鍵を読み取るため、forceReturnValue パラメーターは有効になりません。1 つのトランザクションがコミットし、もう 1 つのトランザクションがロールバックします。ただし、cache.get() 操作には追加のサーバー要求が必要です。サーバーリクエストが非効率な cache.put() オペレーションの戻り値が必要ない場合。
4.7.5. 設定済みトランザクションマネージャーおよびトランザクションモードの使用 リンクのコピーリンクがクリップボードにコピーされました!
以下の例は、RemoteCacheManager で設定した TransactionManager および TransactionMode を使用する方法を示しています。