@Transactional方法在没有@Transactional注释的情况下调用另一个方法?

我在服务类中看到一个标记为 的方法,但它也调用了同一类中未标记为 .@Transactional@Transactional

这是否意味着对单独方法的调用导致应用程序打开与 DB 的单独连接或挂起父事务等?

不带任何批注的方法的默认行为是什么,由另一个带有批注的方法调用?@Transactional


答案 1

当您在没有事务块内调用方法时,父事务将继续使用新方法。它将使用来自父方法(with )的相同连接,并且在被调用的方法(不带)中引起的任何异常都将导致事务回滚,如事务定义中配置的那样。@Transactional@Transactional@Transactional

如果你从属于同一Spring的方法调用一个带有注释的方法,那么被调用的方法事务行为不会对事务产生任何影响。但是,如果您从具有事务定义的另一个方法调用具有事务定义的方法,并且它们属于不同的Spring s,则被调用方法中的代码将遵循其自己的事务定义。@Transactional@TransactionalBeanBean

您可以在 Spring 事务文档的声明性事务管理部分找到更多详细信息。

Spring 声明性事务模型使用 AOP 代理,因此 AOP 代理负责事务创建。仅当被调用的方法属于与调用方方法不同的 Spring 时,AOP 代理才会处于活动状态。Bean


答案 2
  • 这是否意味着对单独方法的调用会导致应用程序打开与 DB 的单独连接或挂起父事务等?

这取决于传播水平。以下是所有可能的级别

例如,如果传播级别是嵌套的,则当前事务将“挂起”并创建新事务(注意:实际创建嵌套事务仅适用于特定的事务管理器) )

  • 由具有批注的另一个方法调用的没有任何批注的方法的默认行为@Transactional是什么?

默认的传播级别(您称之为“行为”)是必需的。如果调用的“内部”方法上有注释(或通过XML以声明方式进行交易),它将在同一事务中执行,例如“没有新内容”被创建。@Transactional


推荐