Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在spring中使用@Transactional注释的最佳实践_Spring_Spring Boot - Fatal编程技术网

在spring中使用@Transactional注释的最佳实践

在spring中使用@Transactional注释的最佳实践,spring,spring-boot,Spring,Spring Boot,我目前正在做一个使用SpringBoot的项目。我没有在大多数方法上使用@Transactional注释。但有时当错误指向使用事务性注释时,我会将注释放在上面。我还调用同一服务类中的服务方法 我的问题: 我是否必须在每个服务方法上使用@Transactional注释 或者在服务方法中使用@Transactional注释的最佳实践是什么。我个人在每个服务类上都使用@Transactional(直接在类上,而不是在方法上)。避免自己管理会话/事务是非常有用的,老实说,我认为没有理由不让每个方法都使用

我目前正在做一个使用SpringBoot的项目。我没有在大多数方法上使用
@Transactional
注释。但有时当错误指向使用事务性注释时,我会将注释放在上面。我还调用同一服务类中的服务方法

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


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

我个人在每个服务类上都使用@Transactional(直接在类上,而不是在方法上)。避免自己管理会话/事务是非常有用的,老实说,我认为没有理由不让每个方法都使用它。我有30多个实体和相关的DAO和服务类在类级别使用它,一切都很好

您不必将每个方法都标记为@Transactional,只需将发生错误时要回滚的方法标记为@Transactional(例如,您通常会标记写入,但不标记读取)。还要注意的是,如果从同一类中的非注释方法调用注释方法,注释无效,因为该方法调用不会经过包装代理类。因此,我应该在写入数据库的方法上使用注释。而不是那些我从数据库里读到的,非常感谢@Martin。当然可以。您可能会遇到需要深入到每个方法以获得不同事务行为的场景,例如,如果您希望对某些方法进行不同的事务传播,或者希望回滚不同的异常。如果遇到这种情况,可以使用不同的参数将其更改为方法级别,但老实说,我会首先注释整个类。我正在从事一个非常大的项目,这种方法对于我编写的每个服务类都很好。当然,不同的项目需要不同的需求。而且,如果您需要在服务中使用非事务性方法来调用同一服务中的事务性方法,则需要将对自身的引用自动连接到服务中,以使事务正常工作。这似乎有点奇怪,但它与Spring“包装”服务类的方式有关,并且这种包装只适用于对象本身之外发生的调用。希望这有帮助!