【发布时间】:2021-01-26 20:45:14
【问题描述】:
当我创建一个带有两个实体的@Transactional 方法时,一个用于更新,一个用于插入,Spring 不使用相同的事务进行更新和插入是正常的吗?
@Transactional
public void myMethod(args...){
Entity1 entity1 = entity1Repository.findById(args);
entity1.setValue(args);
Entity2 entity2 = new Entity2();
entity2.setValue(args);
entity2Respository.save(entity2);
}
在休眠日志中,我看到两个事务,一个用于 findBy 和 update,另一个用于插入。
【问题讨论】:
-
查看
entity2Respository.save的实现。你会看到这个方法也被@Transactional注解了,因此多了一笔交易。 -
@SternK 默认
propagation是REQUIRED,意思是“支持当前事务,如果不存在则新建一个”,所以save()方法如果myMethod()更正启动了一个,则不会创建新事务。 --- 但是,如果myMethod()上的@Transactional注释被忽略,不知何故,findById()和save()方法上的注释可能会导致 OP 看到 2 个事务。 -
@Transactional可能无法正常工作的原因有多种。在创建另一个关于@Transactional不起作用的问题之前,您是否检查了 all these questions 的潜在解决方案? -
@SternK 你是对的,所以这意味着只用事务管理是不可能的,不是吗?
-
@JacoboGeada 不,请参阅 Andreas cmets。默认情况下,
@Transactional传播是REQUIRED,这意味着如果新事务已经存在,则不会创建它。
标签: java spring database hibernate transactions