首页 > 解决方案 > @transactional 内部的 Spring 非事务嵌套方法与 @transactional 传播 = 支持相同

问题描述

i) 有什么区别吗,1) 如果我从 @transactional 内部调用非事务性方法,并且 2) 调用传播级别 = 支持同一 @transactional 方法的 @transactional?

ii) 如果回答问题 i) 是相同的豆子还是不同的豆子,有什么不同吗?

谢谢

标签: springtransactionsspring-transactions

解决方案


i) 有什么不同吗,

1)如果我从@transactional AND 内部调用非事务性方法

如果您在事务中调用方法,没有任何设置,事务将跨越到调用方法。

2)调用@transactional,传播级别=来自相同@transactional方法的支持?

Propagation.SUPPORTS带注释的方法将在当前事务中执行,就像调用非事务方法一样。

在javadoc中指出了设置@Transactional(propagation = Propagation.SUPPORTS)和不设置之间的唯一区别:@Transactional

注意:对于具有事务同步的事务管理器,PROPAGATION_SUPPORTS 与根本没有事务略有不同,因为它定义了同步将适用的事务范围。因此,相同的资源(JDBC 连接、Hibernate Session 等)将在整个指定范围内共享。请注意,这取决于事务管理器的实际同步配置。

ii) 如果回答问题 i) 是相同的豆子还是不同的豆子,有什么不同吗?

Spring@Transactional注解默认使用 AOP 代理。

当您methodBmethodA同一个类中调用时,AOP 代理将不会被激活methodB(即完全忽略@Transactional中的注释)。methodB

当您从不同的班级调用时,行为与i)


推荐阅读