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

CDI事务管理:@Transactional是如何工作的?

柯易安
2023-03-14

在会话范围内具有一个简单的CDI bean,其中注入了一个实体管理器:

@Named("myBean")
@SessionScoped
public class MyBean implements Serializable {
    private static final long serialVersionUID = 1L;

    @Inject
    EntityManager em;
   ...

    @Transactional
    private void testInsert() {
        long t = System.currentTimeMillis();

        for (int i=1; i<50000; i++) {  
            create(i);
        }
       System.out.println("Time: " + Long.toString(System.currentTimeMillis()-t));
    }

    private void create(int i) {
        Project p = new Project("Project " + i);
        em.persist(p);
    }
}

现在,当通过EL#{myBean.test插入}调用函数时,有两件事似乎很奇怪:

1)将@Transactional注释移动到方法创建(int)我得到:

javax.persistence。TransactionRequiredException:JBAS011469:执行此操作需要事务(使用事务或扩展持久性上下文)

2) 改为用@Transactional修饰testInsert(),函数立即返回,但JPA仍在后台线程中更新数据库。该过程需要2分钟才能完成仅50000条记录的INSERT。当关闭进程中的Java EE应用程序服务器时,后台进程停止,因此,在我看来,testInsert()不是事务性的。

我在这里的一般误解是什么?如何正确管理交易?

共有1个答案

邢修明
2023-03-14

@javax.transaction.Transactional 是 Java EE 7 中引入的拦截器绑定。CDI 为您的 Bean 注入的代理将拦截带注释的方法调用以将它们包装在事务中。

拦截器不适用于私有方法——我想这是您的示例的主要问题。

 类似资料:
  • 我想了解Spring Batch是如何进行事务管理的。这不是一个技术问题,而是一个概念性的问题:Spring Batch使用什么方法?这种方法的后果是什么? 让我试着澄清一下这个问题。例如,在TaskletStep中,我看到步骤执行通常如下所示: 准备步骤元数据的几个JobRepository事务 每一块要处理的业务事务 更多JobRepository事务,用区块处理的结果更新步骤元数据 这似乎是

  • 问题出在@Transactional中,在我的配置中spring应用程序没有使用它。我怎么能修好它? ...REST控制器没有任何事务性方法,它只使用specifiedServices加载实体。依赖集合(如果未加载到服务中)应为空。 应用程序启动程序类: 我还尝试将@Transactional添加到存储库接口中,但对我来说并不起作用 所以我从存储库中删除了@Transactional,创建了其他服

  • 嗯,在这个问题上我可能是错的,但是我需要你的宝贵意见/建议来站在正确的道路上。 我想知道在和中处理事务管理的好的、更好的、最好的方法,以及每种方法的优缺点。 我知道的一些方案/方法也是如此: 1) 使用AOP注释的Spring事务管理(,,带有诸如,,等建议)。 问题1:我之前用SpringAOP做了一个日志示例,但我不知道如何在事务管理中做同样的事情。事务是否会在该方面类中启动、回滚和提交,并提

  • 问题内容: Java EE7由一堆“ bean”定义组成: 托管Beans 1.0(JSR-316 / JSR-250) Java 1.0的依赖注入(JSR-330) CDI 1.1(JSR-346) JSF托管Beans 2.2(JSR-344) EJB 3.2(JSR-345) 为了摆脱头脑中的混乱,我研究了几篇“何时使用哪种bean类型”的文章。 EJB 的优点之一似乎是 它们仅支持声明式容

  • 问题内容: 我从事SQL的时间不长,但是我想我知道,通过将SQL语句包装在事务中可以完成所有语句,或者没有一个完成。这是我的问题。我有一个具有lineitem集合的订单对象。订单项与order.OrderId相关。我已经验证 所有ID都已设置并且正确, 但是当我尝试保存(插入)订单时,我得到 的INSERT语句与FOREIGN KEY约束“FK_OrderItemDetail_Order”冲突。

  • 我有一个带有JPA/Hibernate的Spring Boot2.x应用程序和两个单独的事务管理器:每个租户1个,应用程序范围1个。所有实体、存储库和服务都被分离在不同的包中。 有没有一种方法可以在包级别上设置事务管理器,这样我就不必在每次使用时都显式地设置它? 基于使用@transactional注释的多个事务管理器中给出的答案,我创建了和元注释,但这不允许我设置标志,这是每个方法所必需的。