首页 > 其他分享 >Spring 事务失效的情况

Spring 事务失效的情况

时间:2023-12-31 13:35:03浏览次数:26  
标签:事务 CustomerDO Spring Exception 回滚 customerDO test 失效 public


1. 数据库引擎不支持事务

以 MySQL 为例,MyISAM存储引擎不支持事务, InnoDB 引擎支持事务。

2. 异常被catch

执行以下测试方法,数据成功插入,调用 test 方法没有回滚。

@Override
    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
    public void test(CustomerDO customerDO) {
        mapper.insert(customerDO);
        try {
            int i = 1 / 0;
        } catch (Exception e) {
            log.info("", e);
        }
    }

3. 异常抛出类型错误

异常抛出类型错误,事务回滚的默认级别是 RuntimeException,抛出的异常必须是 RuntimeException 或它的子类。

抛出的异常是 RuntimeException 时,调用 test 方法回滚成功:

@Override
    @Transactional(propagation = Propagation.REQUIRED)
    public void test(CustomerDO customerDO) throws Exception {
        mapper.insert(customerDO);
        throw new RuntimeException("234334334");
    }

抛出的异常是 Exception 时,是RuntimeException的父类,不被识别,调用 test 方法回滚失败:

@Override
    @Transactional(propagation = Propagation.REQUIRED)
    public void test(CustomerDO customerDO) throws Exception {
        mapper.insert(customerDO);
        throw new Exception("234334334");
    }

解决办法,指定回滚的异常 rollbackFor = Exception.class,调用 test 方法回滚成功:

@Override
    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
    public void test(CustomerDO customerDO) throws Exception {
        mapper.insert(customerDO);
        throw new Exception("234334334");
    }

4. 本类方法调用

本类方法调用,会用 this 关键字,没有经过Spring的代理类去调用此方法。

如下使用this关键字,调用 test 方法回滚失败:

@Override
    public void test(CustomerDO customerDO) throws Exception {
        test1(customerDO);
    }
    
    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
    public void test1(CustomerDO customerDO) throws Exception {
        mapper.insert(customerDO);
        int i = 1 / 0;
    }

如下调用 test 方法回滚成功,REQUIRES_NEW 失效:

@Override
    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
    public void test(CustomerDO customerDO) throws Exception {
        test1(customerDO);
        int i = 1 / 0;
    }

    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
    public void test1(CustomerDO customerDO) throws Exception {
        mapper.insert(customerDO);
    }

5. 没有被Spring管理

没有被Spring管理,无法使用Spring的事务,事务自然不起作用。

一般工程中不会有这种错误,一般 Service 方法是注入到 Controller 里面的。


标签:事务,CustomerDO,Spring,Exception,回滚,customerDO,test,失效,public
From: https://blog.51cto.com/xuxiangyang/9047892

相关文章

  • Spring Boot2.x 集成 OpenFeign 实现 Hystrix 熔断降级与 Ribbon 负载均衡配置
    参考https://blog.csdn.net/zhangchaoyang/article/details/123453616https://blog.csdn.net/u010277958/article/details/88744263https://blog.csdn.net/iwlnner/article/details/110090595https://cloud.tencent.com/developer/article/2225692https://blog.csdn.net/z......
  • Spring AOP快速上手
    什么是AOPAOP全称是aspect-orientedprograming面向切面编程。用于解决横向关注点的问题,横向关注点是指多个模块或者模块中的多个功能需要共享的功能,如日志记录、事务管理、安全控制等等。即重复性的代码抽象出来,形成可复用的代码模块。AOP的核心术语Joinpoint(连接点):程序执......
  • SpringBoot原理学习
    一、IoC/DI相关1.如何进行依赖注入?①依赖注入的三种方式Ⅰ.属性注入/***Field注入/属性注入**///@Resource(name="mySQLDbServiceImpl")//@Autowired@Qualifier(value="mySQLDbServiceImpl")privateDbServicedbService;@Aut......
  • SpringMVC架构中Service层与Mapper层交互参数命名注意事项
    Service层代码begin、end、status为传入Mapper层getOrderSaleOp10方法的参数 GoodsSalesDTO中name、number是接收返回值的成员变量 Mapper层代码其中#{status}#{begin}#{end}与Service传入的map参数中元素名需要保持一致sql中查询的字段名需要与GoodsSalesDTO中成员变......
  • 部署springboot前后端分离框架
    springboot前后端分离的文件长这样 1.是后端代码2.是前端代码3.是数据库省去了语句参照了一下几个博主的文章部署成功:超详细部署后端:https://blog.csdn.net/weixin_45393094/article/details/123674367运行时遇到报错信息:https://blog.csdn.net/qq_44802992/article/detai......
  • 【电影推荐系统】Spring Boot + Vue3 前后端分离项目
    目录0前言1项目前端介绍1.1项目启动和编译1.1.1项目启动1.1.2项目编译1.2前端技术栈1.3功能模块前端界面展示1.3.1基础功能模块1.3.2用户模块1.3.3特色功能展示1.3.4界面自适应实现2项目后端介绍2.1项目打包部署2.1.1项目打包2.1.2项目部署2.2后端功能实现3数据......
  • SpringBoot 集成 Dubbo
    分布式、微服务与RPC什么是分布式?分布式就是将一个应用程序的功能拆分到多个独立的进程中,每个进程都运行在不同的机器上,通过网络连接起来,这样就形成了一个分布式的系统。什么是微服务架构?微服务架构将应用程序拆分成一组小的服务(微服务),每个服务运行在自己的进程中,服务之间通过......
  • Spring学习记录之命名空间注入
    Spring学习记录之命名空间注入前言这篇文章是我第二次学习b站老杜的spring相关课程所进行的学习记录,算是对课程内容及笔记的二次整理,以自己的理解方式进行二次记录,其中理解可能存在错误,欢迎且接受各位大佬们的批评指正;关于本笔记,只是我对于相关知识遗忘时快速查阅了解使用,至于......
  • Spring 事务快速上手
    Spring事务与数据库事务关系spring事务本质上使用数据库事务,而数据库事务本质上使用数据库锁,所以spring事务本质上使用数据库锁,开启spring事务意味着使用数据库锁。spring事务是对数据库事务的封装,最后本质的实现还是在数据库,如果数据库不支持事务,spring的事务是不起作用的。数......
  • SpringBoot2 全局捕获异常实例
    1. SpringBoot全局捕获异常首先写一个会抛出异常的 Controller 类 如下所示,i=1/0,0不能作为除数,显然这个 Controller 类 ErrorController.java会抛出异常。@EnableAutoConfiguration@RestControllerpublicclassErrorController{@RequestMapping("/errorTest......