Java 事务回滚问题中的infinispan缓存对象更新
我们希望在订单管理系统中使用infinispan作为内存数据库。在那里,我们需要做以下类型的操作。这里的现金帐户缓存包含从数据库加载的客户缓存帐户。假设现金账户1的初始余额为1000,现金账户2的初始余额为2000。我们在jboss 7.1应用服务器中的事务中更新两个现金帐户。我们预期的结果是,由于该操作发生在交易内部,两个现金账户的余额保持不变。但不幸的是,即使在事务回滚之后,我们也可以在缓存中看到update对象。美国犹他州 我们要检查的是,当事务回滚时,将对象添加到事务中的缓存中,它将从缓存中删除。但对现有对象的修改保持原样 这只是我们想做的一个例子。实际的一个涉及在单个事务中更新多个对象 您能告诉我们可以使用英飞尼斯潘进行这种手术吗Java 事务回滚问题中的infinispan缓存对象更新,java,jakarta-ee,jboss,jboss7.x,infinispan,Java,Jakarta Ee,Jboss,Jboss7.x,Infinispan,我们希望在订单管理系统中使用infinispan作为内存数据库。在那里,我们需要做以下类型的操作。这里的现金帐户缓存包含从数据库加载的客户缓存帐户。假设现金账户1的初始余额为1000,现金账户2的初始余额为2000。我们在jboss 7.1应用服务器中的事务中更新两个现金帐户。我们预期的结果是,由于该操作发生在交易内部,两个现金账户的余额保持不变。但不幸的是,即使在事务回滚之后,我们也可以在缓存中看到update对象。美国犹他州 我们要检查的是,当事务回滚时,将对象添加到事务中的缓存中,它将从缓
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) {
}
}
}
在infinispan中执行此操作的正确方法是使到CacheCount对象不可变。 否则,您将更改对象的属性,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) {
}
}
}
可能缓存配置为非事务性?默认情况下,缓存是非事务性的。您需要显式地使它们具有事务性(请参阅AS7配置文件中的缓存配置)。这似乎是某种设置问题。您是否试图在缓存不知道的情况下直接修改存储在映射中的值?