spring中事务失效场景

news2024/10/10 12:24:50

文章目录

  • spring中事务失效场景
    • 一、权限访问问题
    • 二、方法用final修饰
    • 三、无事务嵌套有事务的方法
    • 四、没有被spring管理
    • 五、设计的表不支持事务
    • 六、没有开启事务
    • 七、错误的事务传播
    • 八、自己捕获了异常
    • 九、手动抛出别的异常
    • 十、自定义回滚异常

spring中事务失效场景

一、权限访问问题

如果方法不是public的就事务不生效

二、方法用final修饰

因为spring事务底层实现使用了代理,aop,通过jdk的动态代理或者cglib,生成了代理类,在代理类中实现了事务功能,如果方法被final修饰,无法重写该方法,也就无法添加事务的功能

在这里插入图片描述

三、无事务嵌套有事务的方法

    public void testPrivate() {
        testFinal();
    }

    @Transactional
    public  void testFinal(){
        TbUser build = TbUser.builder().userId(1).userAccount("admin").userPassword("123456")
                .blogUrl("www.baidu.com").remark("欢迎访问").build();
        userMapper.insertUser(build);
        int i = 1 / 0;
    }

这里情况下,数据库插入一条数据,数据没有回滚

四、没有被spring管理

在使用spring事务的时候,对象要被spring进行管理,也就是需要创建bean,一般我们都会加@Controller、@Service、@Component、@Repository等注解,可以自动实现bean实例化和依赖注入的功能。,如果忘记加了,也会导致,事务的失效

五、设计的表不支持事务

也可能是数据库不支持事务,比如 MySQL 使用的 MyISAM 存储引擎

六、没有开启事务

springboot项目有自动装配的类DataSourceTransactionManagerAutoConfiguration,已经默认开启了事务,配置spring.datasource参数就行,如果是spring项目,需要在applicationContext.xml配置的,不然事务不会生效

七、错误的事务传播

在使用@Transactional注解时,是可以指定propagation参数的

spring目前支持7种传播特性

  • REQUIRED 如果当前上下文中存在事务,那么加入该事务,如果不存在事务,创建一个事务,这是默认的传播属性值
  • SUPPORTS 如果当前上下文存在事务,则支持事务加入事务,如果不存在事务,则使用非事务的方式执行
  • MANDATORY 如果当前上下文中存在事务,否则抛出异常
  • REQUIRES_NEW 每次都会新建一个事务,并且同时将上下文中的事务挂起,执行当前新建事务完成以后,上下文事务恢复再执行
  • NOT_SUPPORTED 如果当前上下文中存在事务,则挂起当前事务,然后新的方法在没有事务的环境中执行
  • NEVER 如果当前上下文中存在事务,则抛出异常,否则在无事务环境上执行代码
  • NESTED 如果当前上下文中存在事务,则嵌套事务执行,如果不存在事务,则新建事务
    @Transactional(propagation = Propagation.NEVER)
    public  void testFinal(){
        TbUser build = TbUser.builder().userId(1).userAccount("admin").userPassword("123456")
                .blogUrl("www.baidu.com").remark("欢迎访问").build();
        userMapper.insertUser(build);
        int i = 1 / 0;
    }

正常来说这里出现错误,数据库不会插入一条数据,可是这里的事务传播行为是不支持事务的,最终结果就是数据插入了一条数据

前支持事务的三种传播特性为:REQUIRED,REQUIRES_NEW,NESTED

八、自己捕获了异常

    @Transactional
    public  void testFinal(){

        TbUser build = null;
        try {
            build = TbUser.builder().userId(1).userAccount("admin").userPassword("123456")
                    .blogUrl("www.baidu.com").remark("欢迎访问").build();
            userMapper.insertUser(build);
            int i = 1 / 0;
        } catch (Exception e) {
            System.out.printf(e.toString());
//            throw new RuntimeException(e);
        }
    }

写代码的时候我们使用try…catch手动捕获了异常,然后没有手动抛出异常,所以这里事务不生效,数据库中会插入一条数据,如果要让事务生效,必须抛出它能处理的异常,如果没有抛出异常,spring会认为程序没有问题

九、手动抛出别的异常

    @Transactional
    public  void testFinal() throws Exception {

        TbUser build = null;
        try {
            build = TbUser.builder().userId(1).userAccount("admin").userPassword("123456")
                    .blogUrl("www.baidu.com").remark("欢迎访问").build();
            userMapper.insertUser(build);
            int i = 1 / 0;
        } catch (Exception e) {
            throw new Exception(e);
//            throw new RuntimeException(e);
        }
    }

上面我们捕获了异常,然后手动抛出Exception,事务同样不会回滚,因为spring事务,默认情况下不会回滚Exception(非运行时的异常),只会回滚RuntimeException(运行时异常)和Error(错误)

十、自定义回滚异常

rollbackFor 默认是 RuntimeException 和 Error 及子类抛出,就会回滚;如果 rollbackFor 指定了异常类型,那只有指定的异常及子类发生才会回滚

  @Transactional(rollbackFor = BusinessException.class)
  public  void query(Demo demo) throws Exception{
          save(demo);
  }

BusinessException 这个就是我们自定义异常,只有当这个异常发生的时候才会回滚

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/190697.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件研发管理经验总结 - 事务管理

软件研发管理经验总结 - 事务管理 相关系列文章 软件产品研发管理经验总结-管理细分 软件研发管理经验总结 - 事务管理 目录软件研发管理经验总结 - 事务管理一、概述二、事务管理过程1、制定开发计划2、启动会议3、阅读前一天的日报4、例会/早会5、调整计划6、协调资源7、日报…

LeetCode——2325. 解密消息

一、题目 给你字符串 key 和 message ,分别表示一个加密密钥和一段加密消息。解密 message 的步骤如下: 使用 key 中 26 个英文小写字母第一次出现的顺序作为替换表中的字母 顺序 。 将替换表与普通英文字母表对齐,形成对照表。 按照对照表…

vue全家桶(三)前端路由

vue全家桶(三)前端路由1.路由的概念1.1路由1.2vue Router2.vue-router的基本使用步骤2.1基本使用步骤2.2路由重定向3.vue-router的嵌套路由用法3.1嵌套路由的用法4.vue-router动态路由匹配用法5.vue-router命名路由用法6.vue-router编程式导航用法6.1 页…

06 Sentinel控制台规则配置讲解 (2)

1、实时监控 监控接口的通过的QPS和拒绝的QPS 2、簇点链路 用来显示微服务的所监控的API 3、流控规则 流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以…

源于《C陷阱与缺陷》----研究程序死循环问题

本题来源于《C陷阱与缺陷》这本书,从本质上讲解程序死循环的原因,关键在于栈的空间使用方式。研究程序死循环的原因死循环的原因是什么呢?解决方法总结研究程序死循环的原因 题目1: 在VS2019 X86环境下测试: int mai…

Linux服务器怎么设置iptables防火墙?

当今,为避免香港服务器及其端口受到恶意入侵,保障香港服务器的安全,配置Linux服务器防火墙的重要性不言而喻。恒创科技将向您介绍如何在 CentOS、Ubuntu 和 Debian 服务器中安装和配置 iptables防火墙。iptables是一个简单的防火墙&#xff0…

测试工程师必备技能之编写测试用例

1. 必要性 👉 指导测试工作,用例通过率是评估质量的基准 👉 完善测试人员测试的整体思路,不出现漏测 ❗️ 避免背锅,线上出了问题防止开发甩锅给测试 2. 模板 企业中用例往往是每个人负责不同模块,再根据…

Verilog实现超前进位加法器

在CPU等对性能要求较高的电路中,一般都会采用超前进位加法器,因为超前进位加法器的延时相对来说比较小。下面讲述超前进位加法器的原理: 我们知道,一个三输入,二输出的全加器,其逻辑关系为 SA⊕B⊕CinSA\op…

每日一练9——另类加法走方格的方案数

文章目录另类加法思路:代码:走方格的方案数思路:代码:另类加法 题目链接 思路: 本题可以通过位运算实现,具体实现如下: 两个数求和,其实就是 求和后当前位的数据两个数求和的进位…

Ceres Solver解算已知函数模型参数

一、介绍Ceres solver 是谷歌开发的一款用于非线性优化的库,在已知一个函数表达式,以及一组观测到的值,利用最小二乘是可以解算得到相关参数。下面举例使用ceres solver解算直线函数以及曲线函数参数。其过程包括三个步骤:&#x…

图为技术:专注核心技术 引领行业发展

图为技术T-3D引擎经过多年的技术积累与原始创新,作为国内首批基于分布式技术进行三维图形底层渲染的开拓者,不仅在渲染架构上优势明显,同时其所具备数据管理能力也十分卓越。分布式架构采用独创的(Multi Compute Server To Web Render)架构方…

Java多线程之CAS中的ABA问题与JUC的常见类

文章目录一. CAS指令与ABA问题1. 解析CAS2. 基于CAS实现的原子类3. 基于CAS实现自旋锁4. ABA问题二. JUC中的常见类1. Callable接口2. ReentrantLock类(可重入锁)3. Semaphore类(信号量)4. CountDownLatch同步工具类一. CAS指令与ABA问题 1. 解析CAS CAS即compare and awap, …

Cesium 坐标系的转换,空间数据加载 粒子系统加载

在vue中引入Cesium.js官网下载好的Cesium文件放入vue项目中index.html中引入,在js文件即可智能提示&#xff0c;或者下载依赖包也可<script src"./Cesium/Cesium.js"></script><link rel"stylesheet" href"./Cesium/Widgets/widgets.c…

若依配置教程(六)Excel导入功能实现

若依官网导入实现流程 文章目录一、前端index.vue中1.在所需模块的index.vue中的< script >< /script >中增加如下代码&#xff1a;2.在< template >< /template >中添加导入按钮事件&#xff1a;3.添加导入前端代码&#xff1a;二、在模块文件夹(ruoy…

数学建模学习笔记(17)灰色预测模型和神经网络

文章目录灰色预测模型相关基本概念GM(1,1)模型的使用步骤GM(1,1)模型的拓展模型GM(1,1)模型的注意事项BP神经网络预测模型的注意事项灰色预测模型 相关基本概念 系统的分类&#xff1a; 白色系统&#xff1a;系统的信息是完全明确的。灰色系统&#xff1a;系统的部分信息已知…

readelf指令使用

一、指令说明readelf命令&#xff0c;一般用于查看ELF格式的文件信息&#xff0c;常见的文件如在Linux上的可执行文件&#xff0c;动态库(*.so)或者静态库(*.a) 等包含ELF格式的文件。以下命令的使用是基于android编译出来的so文件上面去运行。readelf常用命令语法&#xff1a;…

视网膜电图特征可以检测成人的抑郁状态和治疗反应:一种机器学习方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 视网膜电图特征可以检测成人的抑郁状态和治疗反应&#xff1a;一种机器学习方法摘要1. 引言2. 方法和材料2.1 人口与伦理声明2.2 入选标准、临床和生物学评估2.3 实验方案2.4…

浅析代理IP与VPS

在跨境行业的热浪期&#xff0c;出海早已成为了企业发展的新趋势。像跨境电商&#xff0c;新媒体&#xff0c;旅游等行业都在开拓海外市场&#xff0c;越来越多的企业产生了匿名浏览互联网&#xff0c;隐藏真实IP的需求。能满足用户这一需求的方法有很多种&#xff0c;代理IP与…

H264/AVC 句法和语义--重要的字段、带截图

一 SPS、PPS句法和语义 宽高在SPS里。 profile_idc&#xff1a;baseline、main、high。 level_idc&#xff1a;值越大&#xff0c;最大宏块处理速率等值越大。 m_ptParam.i_level_idc 21; //X264编码参数 chroma_format_idc&#xff1a;1表示采样格式为4:2:0。 frame_mbs_onl…

C++ 树进阶系列之平衡二叉查找树( AVL)的自平衡算法

1. 前言 树的深度与性能的关系。 在二叉排序树上进行查找时&#xff0c;其时间复杂度理论上接近二分算法的时间复杂度O(logn)。 但是&#xff0c;这里有一个问题&#xff0c;如果数列中的数字顺序不一样时&#xff0c;构建出来的二叉排序树的深度会有差异性&#xff0c;对最…