2013-10-22 10 views
6

注文管理システムでinfinispanをメモリ内のデータベースとして使用したいと考えています。そこで、次のような操作を行う必要があります。ここでキャッシュアカウントキャッシュには、DBからロードされた顧客キャッシュアカウントが含まれます。現金口座1の初期残高が1000で、cashAccount2が2000であるとします。私たちは、jboss 7.1アプリケーションサーバーのトランザクションで両方の現金口座を更新します。結果として期待していたのは、このオペレーションがトランザクション内で発生して以来、両方の現金勘定の残高が変わらずに残っていることです。しかし残念なことに、トランザクションのロールバック後でさえ、我々はキャッシュ内の更新オブジェクトを見ることができる。トランザクションのロールバックがキャッシュから削除されたときに、キャッシュをオブジェクトに追加するときです。しかし、既存のオブジェクトの変更はそのままです。トランザクションロールバックの問題でinfinispanキャッシュオブジェクトの更新

これは単なるサンプルです。実際のトランザクションでは、1つのトランザクションで複数のオブジェクトを更新する必要があります。

このタイプの攻撃に対してinfinispanを使用することが可能であることをお知らせください。

cashAccountCache= provider.getCacheContainer().getCache(CACHE_NAME); 
     try { 
      utx.begin(); 
      CashAccount cashAccount1 = cashAccountCache.get("cashAccNumber1"); 
      CashAccount cashAccount2 = cashAccountCache.get("cashAccNumber2"); 
      cashAccount1.setBalance(cashAccount1 .getBalance() + 100); 
      cashAccount2.setBalance(cashAccount2 .getBalance() + 200); 
      if(true) throw new RuntimeException(); 
      utx.commit(); 
     } catch (Exception e) { 
      if (utx != null) { 
       try { 
        utx.rollback(); 
       } catch (Exception e1) { 
       } 
      } 
     } 
+1

キャッシュが非トランザクションに設定されている可能性がありますか?デフォルトでは、キャッシュは非トランザクションです。トランザクションを明示的に行う必要があります(AS7構成ファイルのキャッシュ構成を参照)。これは何らかの設定問題のようです。 –

+0

キャッシュに保存されていない値を直接マップに保存しようとしていませんか? –

答えて

1

infinispanでこれを行う正しい方法は、CacheAccountオブジェクトを不変にすることです。 それ以外の場合、オブジェクトのプロパティが変更され、Infinispanはオブジェクトのプロパティを制御しません。

//CashAccount Class 
public class CashAccount{ 

    public CashAccount setBalance(int balance){ 
     CacheAccount account = new CacheAccount(this); //deep copy 
     account.setBalance(balance); 
     return account; 
    } 

} 



cashAccountCache= provider.getCacheContainer().getCache(CACHE_NAME); 
try { 
    utx.begin(); 
    CashAccount cashAccount1 = cashAccountCache.get("cashAccNumber1"); 
    CashAccount cashAccount2 = cashAccountCache.get("cashAccNumber2"); 
    cashAccount1 = cashAccount1.setBalance(cashAccount1 .getBalance() + 100); 
    cashAccount2 = cashAccount2.setBalance(cashAccount2 .getBalance() + 200); 
    cacheAccountCache.put("cashAccNumber1", cashAccount1); 
    cacheAccountCache.put("cashAccNumber2",cacheAccount2); 
    if(true) throw new RuntimeException(); 
    utx.commit(); 
} catch (Exception e) { 
    if (utx != null) { 
     try { 
      utx.rollback(); 
     } catch (Exception e1) { 
     } 
    } 
} 
関連する問題