【问题标题】:How to make transaction only effect in a method when a annotated Transactional is added in both class and method?当在类和方法中都添加了带注释的事务时,如何使事务仅在方法中生效?
【发布时间】:2019-07-11 16:37:38
【问题描述】:

我面试过,面试过程中被问到如下问题:当@Transactional注解同时加到类和一个方法上,而没有加到其他方法上,怎么才能只做事务这个方法有效吗?

例如:

@Transactional
public class ClassA {

     @Transactional
     private void methodA() {
     } 

     private void methodB() {
     }

     private void methodC() {
     }
}

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

【问题讨论】:

  • 我不明白你的问题。类级别的注释影响所有方法。方法级别的注解覆盖了可能的类级别注解。
  • effective 的采访是什么意思?在给定的示例中,什么都不会改变。用相同的注释来表示类和方法不会有任何区别。仅当两个注解不同时才会发生差异,例如方法上的@Transactional(readOnly = false) 将覆盖从类级别(@Transactional)继承的注解。

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


【解决方案1】:

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

@Transactional(propagation = Propagation.REQUIRES_NEW)

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

我从未使用过类范围的@Transactional,但propagation 属性实际上非常有用。

我在几种情况下使用它来覆盖默认值Propagation.REQUIRED,它说:“如果一个新事务尚不存在,则创建一个新事务 - 否则 支持 当前事务”,根据文档。

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

org.springframework.transaction.annotation.Transactional

因此,如果您使用的是替代品@Transactional,我的回答将不适用

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    相关资源
    最近更新 更多