【问题标题】:What happens if one @Transactional annotated method is calling another @Transactional annotated method on the same object instance? [duplicate]如果一个@Transactional 注释方法在同一个对象实例上调用另一个@Transactional 注释方法会发生什么? [复制]
【发布时间】:2015-05-27 15:05:27
【问题描述】:

我正在研究如何 Spring 处理事务,我想问如果一个 @Transactional 注释方法在同一个对象实例上调用另一个 @Transactional 注释方法会发生什么?

我知道事务传播默认级别是REQUIRED,所以如果我有一个method1()@Transactional 注释的MyObject 实例调用method2()(用@Transactional 注释)同样的实例我认为,在REQUIRED 级别之后,它是在method1() 创建的同一事务上执行的。

这是我的推理正确还是我遗漏了什么?如果在同一个实例上调用 2 个 @Transactional 方法,我不确定会发生什么。

它是如何工作的?

【问题讨论】:

  • 你能提供一些代码吗?

标签: java spring spring-transactions


【解决方案1】:

如果在同一个类中从method1()调用method2(),第二个方法的@Transactional注解不会有任何作用,因为它不是通过代理调用,而是直接调用。仅当通过代理(自动装配的 bean,或以任何其他方式注入的某些实例)调用时,方法才会通过事务行为得到增强。

但一般来说,如果method1()method2() 在不同的类中,并且都用@Transactional 进行注释(因此使用REQUIRED 传播),那么它们将共享在method1() 开始的同一个事务。

【讨论】:

  • 反对者,需要解释一下吗?
  • 我也想知道为什么这个答案被否决了。第二段也许应该改写,因为它取决于传播级别,但由于默认传播是必需的,所以该段是正确的。
  • Tnx,完美的解释:-)
  • @AndreaNobili 不客气。
  • @PredragMaric 如果 method2() 将传播设置为 REQUIRES_NEW 怎么办?
猜你喜欢
  • 2018-02-23
  • 2011-09-07
  • 2021-01-01
  • 2021-04-25
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
相关资源
最近更新 更多