【问题标题】:@Transactional do not work in Spring Boot@Transactional 在 Spring Boot 中不起作用
【发布时间】:2015-04-02 23:13:09
【问题描述】:

我希望在 Spring Boot 中使用 @Transactional,但经过几次尝试后,尽管内部有异常回滚,但我无法让事务正常工作,所以我错过了什么?

AppConfig.java

@EnableAutoConfiguration
@ComponentScan(basePackages = { "com.geopro" })
@EnableJpaRepositories(basePackages = { "com.geopro.repositories" })
@EntityScan(basePackages = { "com.geopro.entities" })
@EnableTransactionManagement
public class AppConfig {
    @Bean
    public HibernateJpaSessionFactoryBean sessionFactory(EntityManagerFactory emf) {
         HibernateJpaSessionFactoryBean factory = new HibernateJpaSessionFactoryBean();
         factory.setEntityManagerFactory(emf);
         return factory;
    }
}

Metier.java

@Service("metier")
@Aspect
public class Metier {


    @Transactional(readOnly = false , rollbackFor = Exception.class)
    public void saveUpload(UploadData post) throws Exception {
        try {
            post.ADDEDDATA.savesync();
            post.UPDATEDDATA.savesync();

        } catch (Exception e) {
               throw e ;
        }

    }

【问题讨论】:

  • “尽管内部有异常要回滚”——当然,如果发生异常,事务将回滚
  • 在我的情况下它不会回滚。
  • 没什么好说的,也许你可以分享一个项目来证明这个问题。由于您的Metier 服务没有实现接口,我想知道您是否需要@EnableTransactionManagement(proxyTargetClass=true)
  • @PhilWebb 你的把戏很完美,你救了我:D

标签: java spring hibernate transactions spring-boot


【解决方案1】:

我的问题 Transactions not working 的原因是将 AspectJ 通知和 Transactions 混合在同一个类中,因此此选项 @EnableTransactionManagement(proxyTargetClass=true) 强制 Transactions 工作,但即使您将 AspectJ 通知放在专用类中也会禁用它们。

因此,这个问题的最佳解决方案是将 AspectJ 通知放在一个专用的类中,这样事务和 AspectJ 通知就会像预期的那样工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 2019-09-22
    • 2020-06-04
    • 1970-01-01
    • 2019-06-15
    • 2012-04-18
    相关资源
    最近更新 更多