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

一、业务场景

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

二、异常情况处理

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

/**
 * <pre>
 * 网关属性表 服务实现类
 * </pre>
 *
 * @author Mr.Qu
 * @since 2020-01-07
 */
@Slf4j
@Service
public class GatewayServiceImpl extends BaseServiceImpl<GatewayMapper, Gateway> 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 =  '你的表名';

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

发布了3 篇原创文章 · 获赞 2 · 访问量 1533

猜你喜欢

转载自blog.csdn.net/qq_37949192/article/details/103983518