当在类和方法中都添加了带注释的Transactional时,如何使事务仅在方法中生效?

时间:2019-07-10 16:21:13

标签: java spring spring-boot aop spring-aop

我进行了一次采访,在采访中,我被问到以下问题:当@Transactional批注同时添加到类和一个方法时,而不是在其他方法上,我怎么只能这种方法交易有效吗?

例如:

@Transactional
public class ClassA {

     @Transactional
     private void methodA() {
     } 

     private void methodB() {
     }

     private void methodC() {
     }
}

那么,如何确保该类中的其他事务不生效?这个问题的重点是什么?

1 个答案:

答案 0 :(得分:2)

您可以更改内部事务的传播类型:

@Transactional(propagation = Propagation.REQUIRES_NEW)

这将创建一个新的内部事务并暂停外部事务。如果您需要提交内部事务,但是如果其他地方有任何问题,则需要外部事务回滚,这可能会很有用。

我从没使用过类作用域的@Transactional,但实际上,了解propagation属性非常有用。

我在几种情况下都使用它来覆盖默认值Propagation.REQUIRED,该默认值表示:“如果尚不存在,则创建一个新交易-否则支持”,根据文档。

顺便说一句,我正在使用:

org.springframework.transaction.annotation.Transactional

因此,如果您使用其他@Transactional

,我的回答将不适用

还要注意,内部和外部事务区别是基于HQL的,因此您不必担心所使用的SQL方言。