第30章 トランザクション
30.1. Java トランザクション API リンクのコピーリンクがクリップボードにコピーされました!
Red Hat JBoss Data Grid では、Java トランザクション API (JTA) に対応するトランザクションの設定、使用、および参加がサポートされます。
JBoss Data Grid は各キャッシュ操作に対して以下を実行します。
- 最初に、現在スレッドに関連付けされているトランザクションを読み出します。
- XAResource が登録されていない場合は、トランザクションマネージャーに登録し、トランザクションがコミットまたはロールバックされたときに通知を受け取るようにします。
30.2. トランザクションの設定 (ライブラリーモード) リンクのコピーリンクがクリップボードにコピーされました!
Red Hat JBoss Data Grid では、ライブラリーモードのトランザクションは、同期およびトランザクションリカバリーと共に設定できます。トランザクションは全体として (同期およびトランザクションリカバリーを含む)、リモートクライアントサーバーモードでは使用できません。
キャッシュ操作を実行するには、キャッシュに環境のトランザクションマネージャーへの参照が必要となります。TransactionManagerLookup インターフェースの実装に属するクラス名を用いて、キャッシュを設定します。キャッシュが初期化されると、キャッシュは指定クラスのインスタンスを作成し、getTransactionManager() メソッドを呼び出してトランザクションマネージャーへの参照を見つけ、これを返します。
ライブラリーモードでは、トランザクションは以下のように設定されます。
ライブラリーモードでのトランザクションの設定 (プログラムによる設定)
トランザクションの有効化
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - トランザクションモードを設定します。
- ルックアップクラスを選択し、設定します。利用可能なルックアップクラスのリストについては、この手順の下にある表を参照してください。
-
lockingMode値は、楽観的または悲観的ロックを使用するかどうかを決定します。キャッシュが非トランザクションの場合、ロックモードは無視されます。デフォルト値はOPTIMISTICです。 -
useSynchronization値は、トランザクションマネージャーを使って同期化を登録するようにキャッシュを設定するか、またはキャッシュ自体を XA リソースとして登録するようにキャッシュを設定します。デフォルト値はtrue(同期の使用) です。 recoveryパラメーターをtrueに設定すると、キャッシュのリカバリーが有効になります。recoveryInfoCacheNameは、リカバリー情報が保持されるキャッシュの名前を設定します。キャッシュのデフォルト名はRecoveryConfiguration.DEFAULT_RECOVERY_INFO_CACHEによって指定されます。
書き込みスキューチェックの設定
writeSkewチェックは、異なるトランザクションからのエントリーへの変更によってトランザクションがロールバックされるべきかどうかを判別します。書き込みスキューがtrueに設定された場合、isolation_levelをREPEATABLE_READに設定する必要があります。writeSkewおよびisolation_levelのデフォルト値はそれぞれfalseとREAD_COMMITTEDです。Configuration config = new ConfigurationBuilder()/* ... */.locking() .isolationLevel(IsolationLevel.REPEATABLE_READ).writeSkewCheck(true);Configuration config = new ConfigurationBuilder()/* ... */.locking() .isolationLevel(IsolationLevel.REPEATABLE_READ).writeSkewCheck(true);Copy to Clipboard Copied! Toggle word wrap Toggle overflow エントリーのバージョン管理の設定
クラスター化されたキャッシュについては、エントリーのバージョン管理を有効にし、その値を
SIMPLEに設定することにより書き込みスキューのチェックを有効にします。Configuration config = new ConfigurationBuilder()/* ... */.versioning() .enable() .scheme(VersioningScheme.SIMPLE);Configuration config = new ConfigurationBuilder()/* ... */.versioning() .enable() .scheme(VersioningScheme.SIMPLE);Copy to Clipboard Copied! Toggle word wrap Toggle overflow
| クラス名 | 説明 |
|---|---|
|
org.infinispan.transaction.lookup.DummyTransactionManagerLookup |
テスト環境で主に使用されます。このテスト向けのトランザクションマネージャーは実稼働環境では使用されず、特に並列トランザクションやリカバリーなどの機能は厳しく制限されます。 |
|
org.infinispan.transaction.lookup.JBossStandaloneJTAManagerLookup |
Red Hat JBoss Data Grid がスタンドアロン環境で実行される場合のデフォルトのトランザクションマネージャーです。これは、JBoss Transactions ベースの完全に機能するトランザクションマネージャーで、 |
|
org.infinispan.transaction.lookup.GenericTransactionManagerLookup |
GenericTransactionManagerLookup は、トランザクションルックアップクラスが指定されていない場合にデフォルトで使用されます。このルックアップクラスは、JBoss Data Grid を、TransactionManager インターフェースを提供する Java EE 互換環境で使用する場合に推奨されます。このルックアップクラスは、ほとんどの Java EE アプリケーションサーバーでトランザクションマネージャーを見つけることができます。トランザクションマネージャーが見つからない場合、デフォルトは |
|
org.infinispan.transaction.lookup.JBossTransactionManagerLookup |
|
Red Hat JBoss Data Grid を Tomcat または通常の Java Virtual Machine (JVM) と使用する場合、推奨される Transaction Manager Lookup クラスは JBoss Transactions を使用する JBossStandaloneJTAManagerLookup です。
30.3. 複数のキャッシュインスタンス間でのトランザクション リンクのコピーリンクがクリップボードにコピーされました!
各キャッシュは個別のスタンドアロン Java Transaction API (JTA) リソースとして動作します。ただし、コンポーネントは最適化のために Red Hat JBoss Data Grid の内部で共有できますが、この共有は、キャッシュが Java Transaction API (JTA) Manager とどのように対話するかに影響を与えません。
30.4. トランザクションマネージャー リンクのコピーリンクがクリップボードにコピーされました!
以下を使用して、キャッシュから TransactionManager を取得します。
TransactionManager tm = cache.getAdvancedCache().getTransactionManager();
TransactionManager tm = cache.getAdvancedCache().getTransactionManager();
トランザクション内で操作のシーケンスを実行するには、TranspactionManager 上で begin() および commit() メソッド (または rollback() メソッド) への呼び出しを使ってこれらの操作をラップします。
操作の実行
キャッシュメソッドが JTA トランザクションのスコープ内で CacheException (または、CacheException のサブクラス) を返すと、トランザクションはロールバックするよう自動的にマークされます。
Red Hat JBoss Data Grid XAResource への参照を取得するには、以下の API を使用します。
XAResource xar = cache.getAdvancedCache().getXAResource();
XAResource xar = cache.getAdvancedCache().getXAResource();