springboot开启事务注解@Transactional(rollbackFor = Exception.class),但事务仍未生效,回滚失败

一、业务场景

       1、springboot搭建项目,因为有些查询方法不需要开启事务,所以没有在service服务实现类上面直接添加,而是在service服务实现类中某些需要事务的方法上面添加事务回滚注解@Transactional(rollbackFor = Exception.class),但是在操作业务的时候同时向多个表插入数据,其中有一个插入异常,别的插入正常,事务正常情况下插入正常的数据是会回滚的,不会保存在数据库;但是异常情况下:比如代码编写不当或者表中的引擎不对,事务是无法生效的

二、异常情况处理

      1、代码编写不当,方法:在try-catch异常捕获的时候要手动在catch语句块中抛出异常,不然事务会失败,例如:  

/**
 * 
 * 网关属性表 服务实现类
 * 
* * @author Mr.Qu * @since 2020-01-07 */ @Slf4j @Service public class GatewayServiceImpl extends BaseServiceImpl implements GatewayService { @Autowired private GatewayMapper gatewayMapper; @Transactional(rollbackFor = Exception.class) @Override public boolean saveGateway(Gateway gateway) throws Exception { boolean res = false; try { res= super.save(gateway); // 此处设计一个异常 int a = 100/0; } catch (Exception e) { throw new RuntimeException(e.getMessage()); } return res; } }

     注意:@Transactional 注解只应用到 public 修饰的方法上,在 protected、private 修饰的方法上都不会起作用

     2、数据库中表设计的有问题

数据库存储引擎对比
特性 InnoDB MyISAM MEMORY
事务安全 支持
存储限制 64TB
空间使用
内存使用
插入数据速度
外键支持 支持

         通过上面的对比发现:InnoDB支持事务 ,其余两个不支持事务。

         查看自己设计的表中引擎是否为InnoDB两种方式:

                   方式一、show TABLE STATUS FROM 你的数据库名称 WHERE name =  '你的表名';

                   方式二、鼠标选中表然后右键,选择设计表、接着点击选项。就会看到表的情况;

你可能感兴趣的:(mysql,事务)