在Spring中使用@Transactional注解的最佳实践

3

我目前正在使用Spring Boot进行项目开发。在大多数方法中,我没有使用@Transactional注释。但有时当出现指向需要事务注释的错误时,我会在其上放置该注释。同时,在同一服务类内调用服务方法。

我的问题是: 我是否必须在每个服务方法中使用@Transactional注释。

或者,在服务方法中使用@Transactional注释的最佳做法是什么。


你不需要将每个方法都标记为@Transactional,只需标记那些在出现错误时希望回滚的方法(例如,通常会标记写操作,但不标记读操作)。还要注意,如果你从同一类中的非注解方法调用一个已注解的方法,注解将无效,因为该方法调用不会经过包装代理类。 - undefined
1
所以,在我写入数据库的方法上,我应该使用注解,而不是在读取数据库的方法上使用注解。 - undefined
1个回答

3

我个人在每个服务类上都使用@Transactional(直接在类上使用,而不是方法)。它非常有用,可以避免自己管理会话/事务,而且我真的看不出没有使用它的理由。我有超过30个实体和关联的DAO和服务类在类级别上使用它,一切都很顺利。


非常感谢,@Martin。我一定会这样做的。 - undefined
你可能会遇到一些情况,需要针对不同的事务行为深入到每个方法中,例如如果你想要为某些方法设置不同的事务传播方式或者不同的异常回滚。如果你遇到这种情况,你可以通过改变方法级别的参数来实现,但是我个人认为最好先在整个类上进行注解。我正在处理一个非常大的项目,而且这种方法对我编写的每个服务类都很有效。当然,不同的项目会有不同的需求。 - undefined
而且,如果你在服务中需要一个非事务性的方法来调用同一服务中的一个事务性方法,你需要将对自身的引用自动装配到你的服务中,以使事务正常工作。这似乎有点奇怪,但这与Spring“包装”你的服务类的方式有关,这种包装只适用于发生在对象本身之外的调用。希望这能帮到你! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接