2013-10-22 42 views
6

Mamy nadzieję, że będziemy używać infinispan jako bazy danych w pamięci w systemie zarządzania zamówieniami. Tam musimy wykonać następujący typ operacji. Tutaj pamięć podręczna konta pieniężnego zawiera konto cache klienta załadowane z DB. Załóżmy, że saldo rachunku gotówkowego1 wynosi 1000, a kontoKonto2 to 2000. aktualizujemy oba konta pieniężne w transakcji na serwerze aplikacji jboss 7.1. czego oczekujemy w wyniku, że salda obu rachunków pieniężnych pozostają bez zmian, ponieważ operacja ta wystąpiła wewnątrz transakcji. Ale niestety nawet po wycofaniu transakcji możemy zobaczyć obiekt aktualizacji z boku pamięci podręcznej. ut to, co badamy, to kiedy dodamy obiekt do pamięci podręcznej po stronie transakcji, gdy wycofa się transakcja, zostanie ona usunięta z pamięci podręcznej. Ale modyfikacja istniejącego obiektu pozostaje taka, jaka jest.Aktualizacja obiektu pamięci podręcznej infinispan w procedurze zwrotu wycofania transakcji

To tylko próbka tego, co chcemy zrobić. Rzeczywiste wymagają aktualizacji kilku obiektów w pojedynczej transakcji.

Czy możesz dać nam znać, że można użyć infinispan dla tego typu opperacji.

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

Być może pamięć podręczna jest skonfigurowana jako nietransakcyjna? Domyślnie pamięci podręczne nie są transakcyjne. Konieczne jest jawne dokonanie transakcji (zobacz konfiguracje cache w pliku konfiguracyjnym AS7). To wygląda na problem z konfiguracją. –

+0

Czy nie próbujesz bezpośrednio modyfikować wartości przechowywanej na mapie bez znajomości pamięci podręcznej? –

Odpowiedz

1

Właściwym sposobem zrobienia tego w infinispan jest uczynienie z obiektu CacheAccount niezmiennego. W przeciwnym razie zmieniasz właściwość obiektu, a Infinispan nie ma nad nim kontroli.

//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) { 
     } 
    } 
}