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

时间:2018-09-13 09:39:30

标签: spring spring-boot transactions spring-data-jpa

我有一个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);
    }

}

config类DataConfig.java如下:

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

我担心@EnableTransactionManagement。此注释的确切含义是什么?在这种情况下(我不应该)使用@Transactional吗?

1 个答案:

答案 0 :(得分:2)

@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();
     }
 }