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>
<replicated-cache name="hotrodReplTx">
<locking isolation="REPEATABLE_READ"/>
<transaction mode="NON_XA" locking="PESSIMISTIC"/>
</replicated-cache>
Hot Rod トランザクションには、独自の復旧メカニズムがあります。
3.8.2. Hot Rod クライアントの設定 リンクのコピーリンクがクリップボードにコピーされました!
{rcm} の作成時に、{rc} が使用するデフォルトの {tm} および {tx-mode} を設定できます。
{rcm} を使用すると、以下の例のように、トランザクションキャッシュに設定を 1 つだけ作成できます。
上記の設定は、リモートキャッシュのすべてのインスタンスに適用されます。異なる設定をリモートキャッシュインスタンスに適用する必要がある場合は、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
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
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} は書き込み操作を実行する前にサーバーから最新の値を取得しません。
このパラメーターは、最新の値が必要なため、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() オペレーションの戻り値が必要ない場合。
3.8.6. 設定済みトランザクションマネージャーおよびトランザクションモードの使用 リンクのコピーリンクがクリップボードにコピーされました!
以下の例は、RemoteCacheManager で設定した TransactionManager および TransactionMode を使用する方法を示しています。
3.8.7. トランザクションマネージャーの上書き リンクのコピーリンクがクリップボードにコピーされました!
以下の例は、getCache メソッドで TransactionManager を上書きする方法を示しています。
3.8.8. トランザクションモードの上書き リンクのコピーリンクがクリップボードにコピーされました!
以下の例は、getCache メソッドで TransactionMode を上書きする方法を示しています。