【问题标题】:Spring @Transactional beahviourSpring @Transactional 行为
【发布时间】: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 默认propagationREQUIRED,意思是“支持当前事务,如果不存在则新建一个”,所以save()方法如果myMethod() 更正启动了一个,则不会创建新事务。 --- 但是,如果 myMethod() 上的 @Transactional 注释被忽略,不知何故,findById()save() 方法上的注释可能会导致 OP 看到 2 个事务。
  • @Transactional 可能无法正常工作的原因有多种。在创建另一个关于 @Transactional 不起作用的问题之前,您是否检查了 all these questions 的潜在解决方案?
  • @SternK 你是对的,所以这意味着只用事务管理是不可能的,不是吗?
  • @JacoboGeada 不,请参阅 Andreas cmets。默认情况下,@Transactional 传播是REQUIRED,这意味着如果新事务已经存在,则不会创建它。

标签: java spring database hibernate transactions


【解决方案1】:

从主方法到子方法使用 @Transactional(propagation.MANDATORY) 我可以为所有实体使用一个事务

【讨论】:

    【解决方案2】:

    你是从哪里调用 myMethod() 的? 如果它来自同一个类,那么就像 @Transactional 注释甚至不存在,因为没有在 spring 代理对象上调用方法,并且您将有单独的事务用于更新和插入。

    【讨论】:

      猜你喜欢
      • 2012-01-16
      • 2017-09-30
      • 1970-01-01
      • 2015-04-16
      • 2023-03-10
      • 2021-12-30
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多