Infinispanのドキュメントには、楽観的および悲観的なロック スキームについて多くのことが書かれていますが、トランザクションの使用方法については詳しく説明されていません。おそらくJavaのデフォルトAPIを使っているので知っていると思われますが、そうであればJTAの利用パターンについても調べていませんでした。
楽観的なトランザクションを使用する場合、データへの同時アクセスに応じて、コミットまたはロールバックされると想定しています。ロールバックされた場合、トランザクションをリプレイできるようになり、トランザクションが完了することを期待しています。他の同時アクセスの前に成功します。私は TransactionManager に begin()、commit()、rollback() メソッドを持っています。この情報を使用して、次のコードを作成しました。
public void transactionSum(Key key, Long delta) {
boolean redo;
do{
redo = false;
try {
tm.begin();
try {
Long value = cache.get(key);
// Some processing:
value += delta;
cache.put(key, value);
tm.commit();
} catch(CacheException e) {
tm.rollback();
throw new RollbackException();
}
} catch (RollbackException e) {
redo = true;
logger.debug("Cache transaction collision, replaying it.");
} catch (Exception e) {
logger.error(e.getMessage());
}
} while(redo);
}
このコードは正しいですか? おそらく一般的な操作を実行するには複雑すぎるように思われるため、何か間違ったことをしたのではないかと思いCacheException
ますcache.put()
... もしそうなら、私は明示的に呼び出す必要がありますtm.rollback()
か? 句tm.commit()
の中で呼び出したらどうなりますか? finally
いつスローしRollbackException
ますか?
さらに重要なことは、トランザクションのリプレイを実行する慣用句/デフォルトの方法はありますか?