没有 JPA @Transaction 和 save() 啥时候提交完成?

Posted

技术标签:

【中文标题】没有 JPA @Transaction 和 save() 啥时候提交完成?【英文标题】:Without JPA @Transaction and save() when is the commit done?没有 JPA @Transaction 和 save() 什么时候提交完成? 【发布时间】:2020-08-10 07:28:21 【问题描述】:

当一个方法有@Transaction 注释时,我知道提交是在方法结束时完成的。但是当我不使用@Transaction 时,我不清楚提交何时完成。在我的示例中,我不使用@Transaction,在另一个服务中进行真正的更改并且不使用 someRepository .save(),但它仍然有效:

    @Service
    public class ServiceA 

        private final SomeRepository someRepository;
        private final ServiceB serviceB;

        public ServiceA(SomeRepository someRepository, ) 
            this.someRepository = someRepository;
            this.serviceB = serviceB;
        

        // Called from controller
        public void doStuff() 

            var someEntity = someRepository.findById(1);
            serviceB.makeChange(someEntity);

        

    

    @Service
    public class ServiceB 

        public ServiceB() 

        public void makeChange(SomeEntity someEntity) 

            someEntity.setName("Test"); // this is working and committed to the database

        

    

所以实际上我有两个问题:

    当我不向方法添加@Transaction 注释时,提交何时完成? 我什至不必调用 someRepository.save(entity)?我认为只有在使用 @Transaction 注释时才有效?

上下文:

Spring Boot 2.2.6 “spring-boot-starter-data-jpa”作为依赖项

【问题讨论】:

【参考方案1】:

第一个澄清:@Transactional 注释并不意味着方法末尾有提交。这意味着该方法加入了事务(或开始一个新的事务 - 这取决于传播属性是准确的),因此提交(或回滚)将在事务结束时执行,这可能(并且经常)涉及具有各种数据库访问权限的多种方法。 通常 Spring(或其他事务管理器)会处理此问题(即禁用自动提交)。

@Transactional 缺失 没有事务上下文,因此在修改数据库时立即执行提交。没有回滚选项,如果出现错误,可能会违反数据完整性,

@Transactional 已定义 在事务期间,JPA 实体处于托管状态,在事务结束时,状态会自动刷新到数据库(无需调用 someRepository.save(entity)

【讨论】:

以上是关于没有 JPA @Transaction 和 save() 啥时候提交完成?的主要内容,如果未能解决你的问题,请参考以下文章

使用JPA保存对象时报nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOn

忽略JPA查询超时参数但@Transaction注释有效

org.springframework.transaction.CannotCreateTransactionException:无法为事务打开 JPA EntityManager

调用super的方法时出现JPA Transaction错误

解决报错:JPA No EntityManager with actual transaction available for current thread

JPA出现Transaction marked as rollback only异常 总结