【问题标题】:Spring Transactions and AOP proxies [closed]Spring事务和AOP代理[关闭]
【发布时间】:2021-04-16 06:43:18
【问题描述】:

在许多文章中,我阅读了以下“Spring 的声明式事务是通过 AOP 代理启用的”。

对于像我这样的新手,这究竟意味着什么?

我可以在哪些类或 bean 上使用 @Transactional 注释?

是否必须在 POM.xml 中添加 maven 依赖“spring-aop”?

是否明确需要 @EnableTransactionManagement 才能使事务正常工作?

【问题讨论】:

标签: java spring-boot transactions aop


【解决方案1】:

已经有an answer 详细介绍了@Transactional 的作用和工作原理。

关于您的其他问题。

我可以在哪些类或 bean 上使用 @Transactional 注释?

理论上你想要的每一门课。你应该这样做吗?例如,在创建 Web 层时,事务边界通常被认为是一个坏主意,因为您的服务层应该是事务边界。

我必须在pom.xml 中添加maven 依赖项spring-aop 吗?

没有。 spring-tx 依赖项本身已经拉动了它。当使用spring-boot-starter-data-jpa(或其他与持久性相关的)时,它也会自动包含在内。

是否明确需要@EnableTransactionManagement 才能使事务正常工作?

这取决于。一般来说,在 Spring Boot 应用程序中您不需要添加它,因为 Spring Boot 会自动启用它。如果您不使用 Spring Boot,而只是使用常规 Spring 应用程序,则需要在使用 XML 时添加 @EnableTransactionManagement<tx:annotation-driven> 以告诉 Spring 处理 @Transactional 注释。

【讨论】:

  • 可以在任何类上使用@Transactional 注解吗?例如,在我必须维护的应用程序中,Transactional 注释用于 Controller 类(使用 RestController 注释的类)。而且我们经常遇到以下异常:“javax.persistence.TransactionRequiredException: Executing an update/delete query”
  • 理论上你可以,如果你没有。注释你的控制器通常是一个坏主意,因为服务层是你的事务边界,而不是你的 web 层。
  • 那么,这意味着TransactionRequiredException不是因为数据库访问是在Controller类中完成的,对吧?
猜你喜欢
  • 2014-11-30
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 2020-12-18
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多