我应该使用 @Transactional 和 @EnableTransactionManagement 吗?

Max*_*nov 3 spring transactions spring-data-jpa spring-boot

我有一个 Spring Boot 应用程序。一切正常。我只是想了解事务管理器是如何工作的,因为我对我的应用程序有所怀疑。特别是,我对注释有点困惑。

这是Application.java(主类):

@SpringBootApplication(exclude = ActiveMQAutoConfiguration.class)
@EnableScheduling
public class Application extends SpringBootServletInitializer
{

    @Override
    protected SpringApplicationBuilder configure (SpringApplicationBuilder builder) {
        return builder.sources(Application.class);
    }

    public static void main(String[] args)
    {
        SpringApplication.run(Application.class, args);
    }

}
Run Code Online (Sandbox Code Playgroud)

配置类DataConfig.java如下所示:

@Configuration
@EnableTransactionManagement
@ComponentScan("com.pr.hotel")
@EnableJpaRepositories("com.pr.hotel")
@PropertySource("classpath:application.properties")
public class DataConfig
{
    // code
}
Run Code Online (Sandbox Code Playgroud)

我很担心@EnableTransactionManagement。这个注释到底是什么意思呢?在这种情况下我应该使用@Transactional(我不)吗?

Mic*_*hal 5

@EnableTransactionManagement正如它所说:

启用 Spring 的注释驱动的事务管理功能,类似于 Spring 的 XML 命名空间中的支持。

是的,您仍然应该@Transactional对要包装在事务中的方法使用注释。在以下示例中,如果引发异常,saveSomething()则不会应用结果。maybethrowaneException()小心使用org.springframework.transaction.annotation.Transactional和不使用javax.transaction.Transactional

@Transactional注释告诉 Spring 控制何时将数据刷新到数据库(通常在方法成功完成后)。如果没有注释,数据将立即刷新。

这是一种防止出现问题时将不完整的更改写入数据库的机制。进一步阅读: https: //dzone.com/articles/how-does-spring-transactional

@Service
public class DataTransformer() {

     @Transactional
     public void doETL() throws Exception {
        loadSomeEntities();
        saveSomething();
        maybethrowanException();
        saveSomethingElse();
     }
 }
Run Code Online (Sandbox Code Playgroud)