2013-10-22 22 views
6

Sipariş yönetim sistemindeki bellek veri tabanında infinispan kullanmayı umuyoruz. Orada aşağıdaki operasyon tipini yapmalıyız. Burada nakit hesap önbelleği, DB'den yüklenen müşteri önbellek hesabını içerir. Nakit hesabın1 başlangıç ​​bakiyesi1 1000, cashAccount2 ise 2000'dir. Her iki nakit hesabı da bir jboss 7.1 uygulama sunucusundaki bir işlemde güncelleriz. Sonuç olarak beklediğimiz şey, her iki nakit hesabının bakiyesi, bu işlem işlemin içinde gerçekleştiği için değişmeden kalır. Ama ne yazık ki, işlem geri dönüşünden sonra bile güncelleme nesnesini önbellekte yan yana görebiliriz. neyi incelediğimiz, işlem geri döndüğünde önbelleğe bir nesne eklediğimizde, önbelleğe bir nesne eklediğimiz zamandır. Ancak mevcut nesnenin değiştirilmesi olduğu gibi kalır.infinispan önbellek nesnesinde işlem güncellemesi roll back issue

Bu sadece yapmak istediğimiz bir örnektir. Gerçek olan tek bir işlemde birkaç nesneyi güncellemeyi içerir.

Bu türden bir zıtlık için sonsuzluğun kullanılmasının mümkün olduğunu bize bildirir misiniz?

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

Belki de önbellek işlem dışı olacak şekilde yapılandırılmış mı? Varsayılan olarak, önbellekler işlem dışıdır. İşlemleri açık bir şekilde yapmalısınız (AS7 yapılandırma dosyasında önbellek yapılandırmalarına bakınız). Bu bir çeşit kurulum sorunu gibi görünüyor. –

+0

Haritadaki kayıtlı değeri doğrudan önbellek olmadan değiştirmeye çalışmıyor musunuz? –

cevap

1

Bunu sonsuz olarak yapmanın doğru yolu, CacheAccount nesnesini değiştirilemez hale getirmektir. Aksi taktirde, bir nesnenin özelliğini değiştirirsiniz ve Infinispan'ın denetimi yoktur.

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