第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()
メソッドを呼び出してトランザクションマネージャーへの参照を見つけ、これを返します。
ライブラリーモードでは、トランザクションは以下のように設定されます。
ライブラリーモードでのトランザクションの設定 (プログラムによる設定)
トランザクションの有効化
Configuration config = new ConfigurationBuilder()/* ... */.transaction() .transactionMode(TransactionMode.TRANSACTIONAL) .transactionManagerLookup(new GenericTransactionManagerLookup()) .lockingMode(LockingMode.OPTIMISTIC) .useSynchronization(true) .recovery() .recoveryInfoCacheName("anotherRecoveryCacheName").build();
- トランザクションモードを設定します。
- ルックアップクラスを選択し、設定します。利用可能なルックアップクラスのリストについては、この手順の下にある表を参照してください。
-
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);
エントリーのバージョン管理の設定
クラスター化されたキャッシュについては、エントリーのバージョン管理を有効にし、その値を
SIMPLE
に設定することにより書き込みスキューのチェックを有効にします。Configuration config = new ConfigurationBuilder()/* ... */.versioning() .enable() .scheme(VersioningScheme.SIMPLE);
クラス名 | 説明 |
---|---|
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();
トランザクション内で操作のシーケンスを実行するには、TranspactionManager 上で begin() および commit() メソッド (または rollback() メソッド) への呼び出しを使ってこれらの操作をラップします。
操作の実行
tm.begin(); Object value = cache.get("A"); cache.remove("A"); Object prev = cache.put("B", value); if (prev == null) tm.commit(); else tm.rollback();
キャッシュメソッドが JTA トランザクションのスコープ内で CacheException (または、CacheException のサブクラス) を返すと、トランザクションはロールバックするよう自動的にマークされます。
Red Hat JBoss Data Grid XAResource への参照を取得するには、以下の API を使用します。
XAResource xar = cache.getAdvancedCache().getXAResource();