springboot@Transactional事务不生效的几种解决方案

springboot事务不生效的几种解决方案


最近在业务中遇到了很奇怪的场景,在加上 @Transactional注解后,插入2条数据,如果第二条出异常了,第一条不会回滚,排查了很久,上网也找资料看了很久,问题得以解决,总结了事务不生效的几点可能的原因:

  • mysql的MyISAM引擎不支持回滚,如果需要自动回滚事务,需要将mysql的引擎设置成InnoDB;
  • 在业务中抛出异常时,本应该被事务管理器捕获的异常,被手动catch处理了,或者事务结果未满足具体业务需求的,如果需要手动catch异常做业务处理,需要在catch里手动回滚事务TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(),或者在catch中主动抛出异常throw new RuntimeException();.
  • 默认的spring事务只会捕获RuntimeException,如果是非运行时异常也需要进行事务回滚的话,可以在@Transactional注解中加上rollbackfor = Exception.class属性;
  • 项目中没有配置事务管理器(大坑!我遇到的就是这个),需要在配置类或者配置文件中配置,以本人的配置类为例,因为项目是多数据源的,所以要区别配置不同数据源的事务管理器.
  • 数据源一:
    @Bean(name = "detDataSource")
    public DataSource getDataSource() {
        return createDataSource();
    }
    @Bean(name = "detTransactionManager")
    public PlatformTransactionManager txManager(@Qualifier("detDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
  • 数据源二:
@Primary
   @Bean(name = "shardDataSource")
   public DataSource getDataSource() {
       return buildDataSource();
   }
   @Bean(name = "shardTransactionManager")
   public PlatformTransactionManager txManager(@Qualifier("shardDataSource") DataSource dataSource) {
       return new DataSourceTransactionManager(dataSource);
   }

可以看到,两个事务管理器配置了不同的beanName,接下来只需要 在需要事务控制的位置加上该事务管理器的name就可以完美解决啦!

@Override
   @Transactional(value = "detTransactionManager",rollbackFor = Exception.class)
   public int updateOrInsert(BaseRequest<BankTemplateDto> param) {
  • 13
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
在Spring Boot中,如果使用@Transactional注解事务生效,可能有以下几个原因。首先,确保在启动类上没有显式添加@EnableTransactionManagement注解。因为SpringBoot的自动配置机制已经在TransactionAutoConfiguration中启用了该注解,不需要再在启动类上添加。其次,确保你的@Transactional注解被正确应用在需要开启事务的方法上。例如,你可能将它应用在了私有方法上,但是@Transactional只能应用在public方法上才能起作用。还有一种情况是你可能在同一个类中调用了@Transactional注解的方法,这时事务是不会生效的,因为事务的机制是基于代理的,而同一个类内部的方法调用并不会触发代理。解决办法是将被调用的方法移动到另一个类中。最后,如果你使用的是JPA,还需要确保你的方法被正确声明为抛出异常。因为只有在方法抛出RuntimeException或Error时,事务才会回滚。如果你抛出了其他类型的异常,事务将不会回滚。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [springboot中使用@Transactional注解事物不生效的原因(数据库事务隔离机制以及传播机制传播行为)](https://blog.csdn.net/zy103118/article/details/122296318)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [SpringBoot @Transactional 注解未生效](https://blog.csdn.net/weixin_45505313/article/details/103284559)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Spring Boot中Spring data注解的使用](https://download.csdn.net/download/weixin_38506713/13687824)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值