当前位置: 首页 > 面试题库 >

Spring @Transactional Annotation属性的优先级/继承

淳于博文
2023-03-14
问题内容

REQUIRED传播时,如果调用方方法本身是事务型的,那么当前方法是否会覆盖包含的事务属性(例如rollbackFor)(如果它们不同)?

插图:

Class A {
    @Transactional(propagation = Propagation.REQUIRED,
        rollbackFor = { SomeException.class})
    void foo() {
        try {
           b.bar();
        } catch (OtherException e) {
           // is the transaction marked as rollback-only at this point ?
        }
    }
}

Class B {
    @Transactional(propagation = Propagation.REQUIRED,
        rollbackFor = { OtherException.class})
    void bar() {
        [...]
    }
}

编辑

好吧,我想避免一些琐碎的问题,所以让我们清楚一点,我知道弹簧传播处理。

如果不是这样,则下面是文档的相关部分,我只想澄清与上面的示例有关的第一部分:

PROPAGATION_REQUIRED

当传播设置为PROPAGATION_REQUIRED时,将为应用该设置的每种方法创建一个逻辑事务作用域。每个这样的逻辑事务作用域可以单独确定仅回滚状态,而外部事务作用域在逻辑上独立于内部事务作用域。当然,在标准PROPAGATION_REQUIRED行为的情况下,所有这些范围都将映射到同一物理事务。因此,内部事务范围中设置的仅回滚标记确实会影响外部事务实际提交的机会(正如您期望的那样)。

但是,在内部事务范围设置仅回滚标记的情况下,外部事务尚未决定回滚本身,因此回滚(由内部事务范围默默触发)是意外的。此时将引发相应的UnexpectedRollbackException。这是预期的行为,因此事务调用者永远不会被误认为是在确实未执行提交的情况下进行的。因此,如果内部事务(外部调用者不知道)内部将事务无提示地标记为仅回滚,则外部调用者仍会调用commit。外部调用者需要接收UnexpectedRollbackException,以清楚地指示已执行回滚。

我的问题可以这样改写:

逻辑事务作用域是否包含事务属性?


问题答案:

因此,我建立了一个测试用例,简单的答案是肯定的。

事务逻辑作用域包含事务属性,其边界确实是带注释的方法边界。

因此,即使两种方法的基础物理事务都相同,逻辑属性也适合于每种方法,而内部方法可以强制回退外部方法事务。但是,如果最后一次触发提交,则会导致UnexpectedRollbackException。

cf. Spring TransactionInterceptor(评论是我的)

try {
        retVal = invocation.proceed();
}
catch (Throwable ex) {
        completeTransactionAfterThrowing(txInfo, ex);
        throw ex;
}

completeTransactionAfterThrowing():

// txinfo is proper to the invocation target method
if (txInfo.transactionAttribute.rollbackOn(ex)) {
            try {
                txInfo.getTransactionManager().rollback(txInfo.getTransactionStatus());
            }

AbstractPlatformTransactionManager.processRollback():

else if (status.isNewTransaction()) { //requiresnew
    doRollback(status);
}
else if (status.hasTransaction()) { //requiered
        [...]
        doSetRollbackOnly(status);
    }
}


 类似资料:
  • 在我的Spring Boot程序中,由于加载时的属性值不好,我得到了一个失败。特别是,它使用DB2Hibernate方言,但它没有在我所使用的属性文件中定义。 假设没有注释,Spring在哪里查找属性文件?是的,我知道它通常位于src/main/resources/application.properties中 如果我在测试用例中有一个属性,该怎么办;它是否忽略了main中的一个而使用了test中

  • spring对加载外部化配置有明确的命令。 主目录上的devtools全局设置属性(~/.-boot-devtools.properties当devtools处于活动状态时)。 @TestPropertySource对测试的注释。 @springboottest#properties注释属性。 命令行参数。 来自SPRING_APPLICATION_JSON(嵌入环境变量或系统属性中的内联JSON

  • Spring启动版本:2.5.0 null 其中@prodprofile@的值来自pom.xml的配置文件配置部分。 如果在application-prod.properties和application-local.properties中有相同的属性,哪个优先?当我测试时,我发现特定配置文件具有优先级。无法用Spring.Config.Import重写属性值。是预期行为吗?

  • 我正在做一个新的项目,第一次使用Spring-Boot。 传统上,在使用Spring和属性文件进行配置时,我在发行版(WAR)中提供了默认属性,并允许在某个文档位置重写它们。 例如: 这将允许我们在不丢失本地系统配置的情况下重新部署应用程序。 我喜欢Spring,因为它允许我们遵守惯例,这让我担心我可能做错了属性级联。 什么是提供包含在发行版中的外部化属性的最合适的方法,该属性具有合理的默认值(嵌

  • 我需要一个优先级队列,它首先获得具有最高优先级值的项目。我当前正在使用队列库中的PriorityQueue类。但是,这个函数只先返回值最小的项。我尝试了一些很难看的解决方案,比如(sys.maxint-priority)作为优先级,但我只是想知道是否存在更优雅的解决方案。

  • 本文向大家介绍属性选择器和伪类选择器的优先级?相关面试题,主要包含被问及属性选择器和伪类选择器的优先级?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 属性选择器和伪类选择器优先级相同