第30章 トランザクション

30.1. Java トランザクション API

Red Hat JBoss Data Grid では、Java トランザクション API (JTA) に対応するトランザクションの設定、使用、および参加がサポートされます。

JBoss Data Grid は各キャッシュ操作に対して以下を実行します。

  1. 最初に、現在スレッドに関連付けされているトランザクションを読み出します。
  2. XAResource が登録されていない場合は、トランザクションマネージャーに登録し、トランザクションがコミットまたはロールバックされたときに通知を受け取るようにします。

30.2. トランザクションの設定 (ライブラリーモード)

Red Hat JBoss Data Grid では、ライブラリーモードのトランザクションは、同期およびトランザクションリカバリーと共に設定できます。トランザクションは全体として (同期およびトランザクションリカバリーを含む)、リモートクライアントサーバーモードでは使用できません。

キャッシュ操作を実行するには、キャッシュに環境のトランザクションマネージャーへの参照が必要となります。TransactionManagerLookup インターフェースの実装に属するクラス名を用いて、キャッシュを設定します。キャッシュが初期化されると、キャッシュは指定クラスのインスタンスを作成し、getTransactionManager() メソッドを呼び出してトランザクションマネージャーへの参照を見つけ、これを返します。

ライブラリーモードでは、トランザクションは以下のように設定されます。

ライブラリーモードでのトランザクションの設定 (プログラムによる設定)

  1. トランザクションの有効化

    Configuration config = new ConfigurationBuilder()/* ... */.transaction()
            .transactionMode(TransactionMode.TRANSACTIONAL)
            .transactionManagerLookup(new GenericTransactionManagerLookup())
            .lockingMode(LockingMode.OPTIMISTIC)
            .useSynchronization(true)
            .recovery()
                .recoveryInfoCacheName("anotherRecoveryCacheName").build();
    1. トランザクションモードを設定します。
    2. ルックアップクラスを選択し、設定します。利用可能なルックアップクラスのリストについては、この手順の下にある表を参照してください。
    3. lockingMode 値は、楽観的または悲観的ロックを使用するかどうかを決定します。キャッシュが非トランザクションの場合、ロックモードは無視されます。デフォルト値は OPTIMISTIC です。
    4. useSynchronization 値は、トランザクションマネージャーを使って同期化を登録するようにキャッシュを設定するか、またはキャッシュ自体を XA リソースとして登録するようにキャッシュを設定します。デフォルト値は true (同期の使用) です。
    5. recovery パラメーターを true に設定すると、キャッシュのリカバリーが有効になります。

      recoveryInfoCacheName は、リカバリー情報が保持されるキャッシュの名前を設定します。キャッシュのデフォルト名は RecoveryConfiguration.DEFAULT_RECOVERY_INFO_CACHE によって指定されます。

  2. 書き込みスキューチェックの設定

    writeSkewチェックは、異なるトランザクションからのエントリーへの変更によってトランザクションがロールバックされるべきかどうかを判別します。書き込みスキューが true に設定された場合、isolation_levelREPEATABLE_READ に設定する必要があります。writeSkew および isolation_level のデフォルト値はそれぞれ falseREAD_COMMITTED です。

    Configuration config = new ConfigurationBuilder()/* ... */.locking()
            .isolationLevel(IsolationLevel.REPEATABLE_READ).writeSkewCheck(true);
  3. エントリーのバージョン管理の設定

    クラスター化されたキャッシュについては、エントリーのバージョン管理を有効にし、その値を SIMPLE に設定することにより書き込みスキューのチェックを有効にします。

    Configuration config = new ConfigurationBuilder()/* ... */.versioning()
            .enable()
            .scheme(VersioningScheme.SIMPLE);

表30.1 トランザクションマネージャーのルックアップクラス

クラス名説明

org.infinispan.transaction.lookup.DummyTransactionManagerLookup

テスト環境で主に使用されます。このテスト向けのトランザクションマネージャーは実稼働環境では使用されず、特に並列トランザクションやリカバリーなどの機能は厳しく制限されます。

org.infinispan.transaction.lookup.JBossStandaloneJTAManagerLookup

Red Hat JBoss Data Grid がスタンドアロン環境で実行される場合のデフォルトのトランザクションマネージャーです。これは、JBoss Transactions ベースの完全に機能するトランザクションマネージャーで、 DummyTransactionManager の機能上の制限が解消されます。

org.infinispan.transaction.lookup.GenericTransactionManagerLookup

GenericTransactionManagerLookup は、トランザクションルックアップクラスが指定されていない場合にデフォルトで使用されます。このルックアップクラスは、JBoss Data Grid を、TransactionManager インターフェースを提供する Java EE 互換環境で使用する場合に推奨されます。このルックアップクラスは、ほとんどの Java EE アプリケーションサーバーでトランザクションマネージャーを見つけることができます。トランザクションマネージャーが見つからない場合、デフォルトは DummyTransactionManager になります。

org.infinispan.transaction.lookup.JBossTransactionManagerLookup

JbossTransactionManagerLookup は、アプリケーションサーバーで実行中の標準的なトランザクションマネージャーを見つけます。このルックアップクラスは JNDI を使用して TransactionManager インスタンスを検索します。これは、カスタムキャッシュが JTA トランザクションで使用されている場合に推奨されます。

注記

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();