Java 当在类和方法中都添加了带注释的事务时,如何使事务仅在方法中生效?
我接受了一次采访,在采访期间,我被问到了以下问题:当Java 当在类和方法中都添加了带注释的事务时,如何使事务仅在方法中生效?,java,spring,spring-boot,aop,spring-aop,Java,Spring,Spring Boot,Aop,Spring Aop,我接受了一次采访,在采访期间,我被问到了以下问题:当@Transactional注释同时添加到类和一个方法中,而不是添加到其他方法中时,我如何才能仅使此方法的事务有效 例如: @Transactional public class ClassA { @Transactional private void methodA() { } private void methodB() { } private void methodC()
@Transactional
注释同时添加到类和一个方法中,而不是添加到其他方法中时,我如何才能仅使此方法的事务有效
例如:
@Transactional
public class ClassA {
@Transactional
private void methodA() {
}
private void methodB() {
}
private void methodC() {
}
}
那么,如何确保类中的其他事务不生效?此问题的重点是什么?您可以更改内部事务的传播类型:
@Transactional(传播=传播。需要\u NEW)
这将创建一个新的内部事务并挂起外部事务。如果您需要一个内部事务来提交,这可能很有用,但是如果其他地方有任何问题,您需要外部事务仍然回滚
我从未使用过类范围的@Transactional
,但是传播
属性实际上非常有用
我曾在一些情况下使用它来覆盖默认值,Propagation.REQUIRED
,根据文档,它说:“如果一个事务不存在,则创建一个新事务,否则支持当前事务。”
顺便说一下,我正在使用:
org.springframework.transaction.annotation.Transactional
因此,如果您使用的是替代的@Transactional
还要注意,内部和外部事务的区别是基于HQL的,因此您不必担心所使用的SQL方言。我不理解您的问题。类级别的注释会影响所有方法。方法级别的注释覆盖了一个可能的类级别注释。访谈所指的
有效的是什么意思?在给定的例子中,什么都不会改变。用相同的注释表示类和方法不会有任何区别。只有当两个注释不同时才会出现差异,例如方法上的@Transactional(readOnly=false)
将覆盖从类级别继承的注释(@Transactional
)。