Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当在类和方法中都添加了带注释的事务时,如何使事务仅在方法中生效?_Java_Spring_Spring Boot_Aop_Spring Aop - Fatal编程技术网

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
)。