当前位置: 首页 > 知识库问答 >
问题:

如何在Infinispan中使用JTA事务?

微生嘉祥
2023-03-14

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子句中?它什么时候会引发回滚异常?

更重要的是,是否有一些惯用法/默认方法来执行事务重播?

共有1个答案

陆飞鸿
2023-03-14

正确的模式是:

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: 问题: 现在的问题是,我们最终会遇到一个竞争条件,有几个事务试图锁定