没有 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
org.springframework.transaction.CannotCreateTransactionException:无法为事务打开 JPA EntityManager
调用super的方法时出现JPA Transaction错误
解决报错:JPA No EntityManager with actual transaction available for current thread