事务回滚问题中的infinispan缓存对象更新

时间:2013-10-22 17:57:18

标签: java java-ee jboss jboss7.x infinispan

我们希望在订单管理系统中使用infinispan作为内存数据库。我们需要做以下类型的操作。现金帐户缓存包含从DB加载的客户缓存帐户。假设现金账户1的初始余额为1000,cashAccount2为2000.我们在jboss 7.1应用服务器的事务中更新现金账户。我们所期望的结果是两个现金账户的余额保持不变,因为此操作发生在交易内部。但不幸的是,即使在事务回滚后,我们也可以在缓存中看到更新对象。 UT 我们检查的是当事务回滚时,我们在事务的一侧向缓存添加一个对象时,它将从缓存中删除。但现有对象的修改仍然存在。

这只是我们想要做的一个示例。实际的一个涉及在单个事务中更新多个对象。

请您告诉我们可以使用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 个答案:

答案 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) {
        }
    }
}