繁体   English   中英

Spring中的事务处理方法

[英]Transactional methods in Spring

我被困了很多次,问自己为什么我的代码没有将数据持久化到数据库中。 我的意思是,我已经用@Transactional注释了我的简单方法,并且一切似乎都很好,没有问题。 在尝试找出原因之后,我最终会记得我实际上是在同一类内部调用事务方法的,因此spring将立即忽略该注释。 我碰巧在那些情况下,我在@Controller层上将该方法标记为事务性的,这似乎限制了代码的可重用性。 因此,关于这个问题,我有两个问题:

  • @Transactional最适合放置在Spring体系结构的哪个级别( @Controller@Service @Controller等。)?
  • 当从类内部调用带注释的方法时,为什么spring会完全忽略注释?

Spring文档是解释此问题的很好的资料。 最基本的说,当您使用带有注解(例如事务性)的spring时,spring注入对象时实际上是在注入该对象的代理。 这样,它就可以拦截方法调用并执行诸如管理事务之类的工作。 当您自己实例化一个对象或对同一类中的另一个实例方法进行调用时,您不是通过spring代理进行调用的,它将无法管理该调用。

至于应在何处放置事务注释,这取决于您的代码库和对项目结构的看法。 就个人而言,我将它们放在逻辑上合理的情况下放在调用堆栈的上方。

@Transactional最适合放置在Spring体系结构的哪个级别(@ Controller,@ Service等。)?

根据我的经验,最好将其放在服务层上。 您也可以将其添加到其他层中,但要保持一致。 因为如果您基于此'@Transactional'注释添加更多注释,则它在整个应用程序中的行为应相同。

当从类内部调用带注释的方法时,为什么spring会完全忽略注释?

您可以阅读有关基于代理的Spring AOP的工作原理。 这是您的参考资料-

春季嵌套交易

@Transactional方法调用没有@Transactional注释的另一个方法?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM