春季启动@Transactional 不起作用

Posted

技术标签:

【中文标题】春季启动@Transactional 不起作用【英文标题】:Spring boot @Transactional doesn't work 【发布时间】:2015-01-22 22:01:01 【问题描述】:

我在服务层的方法上添加了@Transactional。

@Transactional(readOnly = false)
public void add(UserFollow uf)
    UserFollow db_uf = userFollowRepository.findByUserIdAndFollowUserId(uf.getUserId(), uf.getFollowUserId());
    if(db_uf == null)  
        userFollowRepository.save(uf);      
        userCountService.followInc(uf.getFollowUserId(), true);
        userCountService.fansInc(uf.getUserId(), true);

        throw new RuntimeException();// throw an Exception
    

userFollowRepository.save(uf);还是save seccessful,不回滚...

我在应用程序上启用事务管理器。

@Configuration  
@ComponentScan 
@EnableAutoConfiguration  
@EnableJpaRepositories
@EnableTransactionManagement
public class Application   

    @Bean
    public AppConfig appConfig() 
       return new AppConfig();
    

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

我将@Transactional 移动到控制层,它可以工作,代码:

@Transactional
@RequestMapping(value="following", method=RequestMethod.POST)
public MyResponse follow(@RequestBody Map<String, Object> allRequestParams)
    MyResponse response = new MyResponse();

    Integer _userId = (Integer)allRequestParams.get("user_id");
    Integer _followUserId = (Integer)allRequestParams.get("follow_user_id");



    userFollowService.add(_userId, _followUserId); //this will throw an exception, then rollback


    return response;

谁能告诉我原因,谢谢!

【问题讨论】:

你能指定上面类的包吗? 以及包装上述方法的类定义。 您的应用程序类不需要@EnableJpaRepositories@EnableTransactionManagement。 Spring Boot 会检测到这些。确保您的服务被您的Application 类上的@ComponentScan 检测到。理想情况下,您不需要声明 AppConfig,因为它应该由 @ComponentScan 获取。 更具体地说,对@Transactional add的调用是来自同一个班级还是来自不同班级? 【参考方案1】:

根据http://spring.io/guides/gs/managing-transactions/

@EnableTransactionManagement 激活了 Spring 的无缝事务特性,使得 @Transactional 功能化

所以在你添加了@EnableTransactionManagement 之后它就开始工作了

【讨论】:

以上是关于春季启动@Transactional 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

春季启动中的@Transactional

春季启动验证不起作用

春季启动 - MySQL 设置不起作用

春季启动图像上传到谷歌云存储桶不起作用

春季启动中的休眠统计信息不起作用?

春季启动从 1.2.0 升级到 2.1.3 后,Websocket 推送通知不起作用