繁体   English   中英

方法完成时,Spring EntityManager提交事务

[英]Spring EntityManager Commit Transaction as method completes

我正在使用spring EntityManager并且需要在方法完成时提交记录。 那就是我有两种方法用于ex ::

    @Override
    @Transactional
    public void upsert(String lastSuccessfullRun) {
        for( tableData in Tables){
         insertIntoDB(tableData);
       }
    }

并且方法insertIntoDB包含实际上执行更新查询的业务逻辑

    @Override
    @Transactional(propagation=Propagation.REQUIRES_NEW)
    public void insertIntoDB (String tableData) {
        em.persist(tableData)
    }

但是问题是该方法没有提交,因为它返回upsert方法中的下一个循环。

如何完成方法?

检查文档

方法可见性和@Transactional

使用代理时,应仅将@Transactional注释应用于具有公共可见性的方法。 如果使用@Transactional注释对受保护的,私有的或程序包可见的方法进行注释,则不会引发任何错误,但是带注释的方法不会显示已配置的事务设置。 如果需要注释非公共方法,请考虑使用AspectJ(请参见下文)。

即使您的方法是公共的,也要在同一类的另一个方法中调用它,所以您不会使用代理,并且insertIntoDB方法上的@Transactional(propagation=Propagation.REQUIRES_NEW)无效。

因此,请像文档一样在AspectJ模式下尝试。

尝试如下所示使用:

@Override
    @Transactional(propagation=Propagation.REQUIRES_NEW)
    public void upsert(String lastSuccessfullRun) {
        for( tableData in Tables){
         insertIntoDB(tableData);
       }
    }



@Override
    @Transactional(propagation=Propagation.SUPPORTS)
    public void insertIntoDB (String tableData) {
        em.persist(tableData)
    }

如果在insertIntoDB方法中使用“ propagation = Propagation.REQUIRES_NEW”,则它将创建一个新事务,并在insertIntoDB方法完成时提交该事务。

@Transactional仅在调用方法throw proxy时起作用,因此在您的情况下不起作用。 如果您确实希望您的更改反映在与活动事务相关联的数据库和PersistenceContext中,则可以使用

EntityManager.flush();

但是请记住,使用flush()时,遇到刷新后,对数据的更改会反映在数据库中,但是它仍处于事务中并且可以回滚并且事务仍处于活动状态,但是当您使用commit()时,会进行更改进入数据库,交易也就此结束。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM