【问题标题】:Spring's @Transactional on class level applies to what methods?Spring 在类级别的@Transactional 适用于哪些方法?
【发布时间】:2015-01-27 12:46:05
【问题描述】:

我有一个有几种方法的类。有些是公开的,有些则不是。请参见下面的示例。

将在事务上下文中执行哪些方法?只有公共方法?

我在documentation 中找不到答案。

@Transactionl
public class A {
  public void pub() {...}
  void pack() {...}
  protected void prot() {...}
  private void pri() {...}
}

【问题讨论】:

  • 通常您有服务接口并通过 JDK 代理实现事务功能。在这种情况下,只有来自服务接口的方法被代理(因此是事务性的)。如果没有服务接口——我猜你的情况,A 类没有实现——你将不得不将 proxy-target-class 设置为 true,我希望你设法从实例外部调用的每个方法都被事务处理,即公共、受保护和包默认值。
  • It's in the documentation,只是不在@Transactional 部分。正如 Michal 所提到的,@Transactional 通过创建代理来工作。所以只有通过代理进入的调用才会触发@Transactional 逻辑。这也有例外。您可以使用编译时编织而不是运行时代理来获取私有/受保护方法上的@Transactional
  • 好吧,我的期望错了。实际上,文档的措辞与 Paulius Matulionis 的答案非常接近。在文档中搜索“如果您注释了受保护的、私有的或”,可以在文档中找到它。我认为他的答案是正确的。

标签: spring spring-transactions transactional


【解决方案1】:

是的,只有公共方法会显示事务设置。如果您将 @Transactional 注释放在私有、受保护或包可见方法或具有此类方法的类上,则不会引发任何错误,只是您的事务设置不会为这些方法执行。

因此,在您的情况下,交易将仅在此方法上打开:

public void pub() {...}

可以在here找到文档。

【讨论】:

  • 谢谢。你是怎么想出来的?可以指点源代码或文档吗?
  • 对不起。当注释处于类级别时,没有提到只有公共方法是事务性的。文档所说的是 @Transactional 注释不能放在 non-public 方法上。
  • 无论如何,非公共必须始终从公共方法执行,因此如果在类上定义了@Transactional 注解,那么所有方法都将在事务上下文中执行。
  • 如果我将@Transactional 注释放在类级别,它是否适用于该类的公共构造函数?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2013-09-06
  • 2013-05-17
  • 2019-12-26
  • 2011-05-22
相关资源
最近更新 更多