Infinispan留档说了很多关于它的锁定方案的东西,乐观的和悲观的,但是没有详细说明如何使用事务。可能它被认为是知道的,因为它使用Java的默认API,但是如果是这样,我也没有找到关于JTA使用模式的信息。
我假设,在使用乐观事务时,它将被提交或回滚,这取决于对数据的并发访问。如果回滚,我将能够重播事务,希望现在它将在其他并发访问之前完成,并将成功。我在TransactionManager上有begin()、commit()和rollback()方法,还有一些记录糟糕的异常,我不确定它们何时会被抛出。根据这些信息,我编写了以下代码:
public void transactionSum(Key key, Long delta) {
boolean redo;
do{
redo = false;
try {
tm.begin();
try {
Long value = cache.get(key);
// Some processing:
value += delta;
cache.put(key, value);
tm.commit();
} catch(CacheException e) {
tm.rollback();
throw new RollbackException();
}
} catch (RollbackException e) {
redo = true;
logger.debug("Cache transaction collision, replaying it.");
} catch (Exception e) {
logger.error(e.getMessage());
}
} while(redo);
}
这个代码正确吗?执行一个本应常见的操作似乎过于复杂,因此我怀疑我做错了什么……如果缓存,是否会抛出一些缓存异常。put()失败?如果是这样,我应该显式调用tm吗。回滚()?如果我打电话给tm怎么办。commit()在finally子句中?它什么时候会引发回滚异常?
更重要的是,是否有一些惯用法/默认方法来执行事务重播?
正确的模式是:
Transaction tx = tm.begin();
try
{
// DO SOMETHING
}
catch (Exception e)
{
tx.setRollbackOnly(); // Force a rollback for this error
throw e;
}
finally
{
if (tx.getStatus() == Status.STATUS_ACTIVE)
tx.commit();
else
tx.rollback();
}
如果没有函数式语言,使用它的最简单方法是通过可调用或类似模式,即https://github.com/galderz/infinispan/blob/master/core/src/test/java/org/infinispan/test/TestingUtil.java#L1307
更新:Infinispan中没有重试事务的功能
我们在Tomcat下有一个web应用程序,它集成了Hibernate4x、Spring4x和HibernateTransactionManager作为我们的事务管理器(目前是一个MySQL资源)。 作为配置分发的一部分,我们应该与Infinispan集成作为缓存管理器,以其他格式存储配置,而不是在MySQL中。意思是,不要像Hibernate那样集成二级缓存! 我设法将Infinispan与Spr
这是一个配置JPA和使用JTA事务模式连接数据库的简单指南。此外,它还包括开发人员最常见的错误,您应该避免这些错误。希望这对你有帮助。
Spring Boot通过使用Atomikos或Bitronix嵌入式事务管理器支持跨多个XA资源的分布式JTA事务。 部署到合适的Java EE Application Server时,也支持JTA事务。 检测到JTA环境时,Spring的JtaTransactionManager用于管理事务。 自动配置的JMS,DataSource和JPA bean已升级为支持XA事务。 您可以使用标准的Sp
jboss narayana jta事务管理器是在我的独立java应用程序中实现的。我可以将事务管理器从jta集成到Hibernate吗?当我调用jta事务管理器的commit方法时,hibernate所做的所有更改也应该提交。请以身作则。
我有一个物品清单。它们是JPA“位置”实体。 我有一个无状态EJB,它在列表中循环并持久化每一个。 代码运行良好。我没有任何问题。然而,问题是:我希望这是一个全有或全无的交易。当前,每次通过for循环,persist()方法都会在数据库中插入一个新行。假设我有100个location对象,而第54个对象有问题,并且抛出了一个异常。将有53条记录插入数据库。我想要的是:在任何一个成功之前,他们必须全
环境: 我们有一个应用程序部署在 JBoss 4.2.3.GA 服务器中,它使用Hibernate 3.4 和 JTA 1.0。 有一个导入器创建或更新某些实体,然后导入一些数据。由于多种原因,大部分导入是在新事务中完成的,在每个事务中,在外部事务中创建/更新的实体可能会再次更新。 调用序列类似于以下伪代码: 服务1: 服务2: 问题: 现在的问题是,我们最终会遇到一个竞争条件,有几个事务试图锁定