事务传播行为 @Transactional

news2024/9/26 5:24:56

文章目录

  • 前言
  • 一、事务是什么?
  • 二、使用步骤
    • 开始验证
    • 1.验证REQUIRED
    • 2.验证 REQUIRES_NEW
    • 3.同一个类中的两个方法
  • 总结


前言

事务传播行为: 指的是在项目中开启多个事务后,他们之间的影响关系;


一、事务是什么?

  • 逻辑上是一组操作,要么执行,要不都不执行。在平时开发中,主要是针对数据库而言的,比如说 MySQL的innodb引擎;
  • 事务能否生效,主要取决于数据库引擎是否支持事务,MySQL 的 InnoDB 引擎是支持事务的,但 MyISAM 就不支持。其次是 是否正确开启了事务;

二、使用步骤

事务可以保证在dml操作之后,如果发生异常,可以将之前的dml操作进行回滚,保证原子性

事务传播枚举

这里重点介绍 REQUIRES_NEW 和 REQUIRED , REQUIRED是事务的默认传播值(不设置默认为REQUIRED)

  • REQUIRES_NEW 意思是开启一个新事务
    • 创建一个新的事务,如果当前存在事务,则把当前事务挂起。也就是说不管外部方法是否开启事务,Propagation.REQUIRES_NEW 修饰的内部方法都会开启自己的事务,且开启的事务与外部的事务相互独立,互不干扰。
  • REQUIRED 意思是
    • 如果外部方法没有开启事务的话,Propagation.REQUIRED 修饰的内部方法会开启自己的事务,且开启的事务相互独立,互不干扰。
    • 如果外部方法开启事务并且是 Propagation.REQUIRED 的话,所有 Propagation.REQUIRED 修饰的内部方法和外部方法均属于同一事务 ,只要一个方法回滚,整个事务都需要回滚。

开始验证

代码如下:
第一个service

@Service
public class TestService {

    @Autowired
    JdbcTemplate jdbcTemplate;

    @Autowired
    Test1Service test1Service;


    @SneakyThrows
    @Transactional(propagation = Propagation.REQUIRED)
    public void test() {
        jdbcTemplate.execute("INSERT INTO `yu_team` (\n" +
                "  `name`,\n" +
                "  `type`,\n" +
                "  `space_id`,\n" +
                "  `remark`,\n" +
                "  `create_time`,\n" +
                "  `update_time`\n" +
                ")\n" +
                "VALUES\n" +
                "  (\n" +
                "    'name',\n" +
                "    0,\n" +
                "    2,\n" +
                "    'remark',\n" +
                "    '2022-10-19 07:04:46',\n" +
                "    '2022-10-19 07:04:46'\n" +
                "  );\n");
        test1Service.insert();
        //insert();
        System.out.println(4/0);
    }


    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void insert() {
        jdbcTemplate.execute("INSERT INTO `yu_team` (\n" +
                "  `name`,\n" +
                "  `type`,\n" +
                "  `space_id`,\n" +
                "  `remark`,\n" +
                "  `create_time`,\n" +
                "  `update_time`\n" +
                ")\n" +
                "VALUES\n" +
                "  (\n" +
                "    '同一个方法内',\n" +
                "    0,\n" +
                "    2,\n" +
                "    'remark',\n" +
                "    '2022-10-19 07:04:46',\n" +
                "    '2022-10-19 07:04:46'\n" +
                "  );\n");
    }

}

第二个service

@Service
public class Test1Service {

    @Autowired
    JdbcTemplate jdbcTemplate;

    @Transactional(propagation = Propagation.REQUIRED)
    public void insert() {
        jdbcTemplate.execute("INSERT INTO `yu_team` (\n" +
                "  `name`,\n" +
                "  `type`,\n" +
                "  `space_id`,\n" +
                "  `remark`,\n" +
                "  `create_time`,\n" +
                "  `update_time`\n" +
                ")\n" +
                "VALUES\n" +
                "  (\n" +
                "    '非同一个类的方法',\n" +
                "    0,\n" +
                "    2,\n" +
                "    'remark',\n" +
                "    '2022-10-19 07:04:46',\n" +
                "    '2022-10-19 07:04:46'\n" +
                "  );\n");
    }
}

1.验证REQUIRED

  • 开启两个事务: 都设置为REQUIRED(或者啥都不设置)
  • TestService 和 Test1Service 分别设置为 REQUIRED
  • 由于 System.out.println(4/0); 所以会报异常,而由于传播特性,两个方法应该所属于同一个事务,所以都应该回滚

结果: 两个都未成功插入到数据库,都回滚了
两个都回滚,数据库新数据插入

2.验证 REQUIRES_NEW

  • 将 Test1Service中的事务传播设置为 REQUIRES_NEW
    设置传播特性
  • 由于REQUIRES_NEW 相当于新开启了一个事务
  • 即使 System.out.println(4/0); 第一个方法中会报异常,但是 Test1Service中相当于开启了新的事务,所以第一个方法会回滚,但是 Test1Service 中的应该不会回滚;

返回依然报错

  • 数据库中已经插入了一条数据
    在这里插入图片描述

佐证了我们的猜想,说明第一个回滚了,但是第二个正常执行插入了,且没有回滚;

3.同一个类中的两个方法

  • 细心的小伙伴会发现,整体验证中,其实 TestService中有一个方法 insert() ,但是被注释掉了;
  • 那么当它开启事务传播特性REQUIRES_NEW 与 Test1Service中开启 的 Test1Service 一样嘛??

直接上答案:
答案是: 不一样,无论改成什么,它都会跟着public void test()方法中的报错一起回滚!! 什么原因呢?

应该是: @Transactional 是基于注解的, 也就是基于aop实现的,那么当内部调用的时候,是无法走代理的,由于spring 默认的代理为基于接口的动态代理,目标需要为一个接口的实现类,才能被代理,那么内部调用就不会有代理,也就无法使添加的注解生效


总结

虽然事务的传播枚举还有很多,但是其实,只要掌握这两个就够了,其他的了解即可;
03、PROPAGATION_NESTED

如果当前存在事务,就在当前事务内执行;否则,就执行与 PROPAGATION_REQUIRED 类似的操作。

04、PROPAGATION_MANDATORY

如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。

05、PROPAGATION_SUPPORTS

如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。

06、PROPAGATION_NOT_SUPPORTED

以非事务方式运行,如果当前存在事务,则把当前事务挂起。

07、PROPAGATION_NEVER

以非事务方式运行,如果当前存在事务,则抛出异常。

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

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

相关文章

ASEMI代理ADUM3223ARZ-RL7原装ADI车规级ADUM3223ARZ-RL7

编辑:ll ASEMI代理ADUM3223ARZ-RL7原装ADI车规级ADUM3223ARZ-RL7 型号:ADUM3223ARZ-RL7 品牌:ADI /亚德诺 封装:SOIC-16 批号:2023 安装类型:表面贴装型 引脚数量:16 工作温度:-40C~125…

form表单与模板引擎

文章目录 一、form表单的基本使用1、什么是表单2、表单的组成部分3、 <form>标签的属性4、表单的同步提交及缺点&#xff08;1&#xff09; 什么是表单的同步提交&#xff08;2&#xff09; 表单同步提交的缺点&#xff08;3&#xff09; 如何解决表单同步提交的缺点 二、…

Java中的位运算

文章目录 Java中支持的位运算位运算规则逻辑运算与运算&#xff08;&&#xff09;或运算&#xff08;|&#xff09;异或运算&#xff08;^&#xff09;取反运算&#xff08;~&#xff09; 位移操作左移&#xff08;<<&#xff09;右移&#xff08;>>&#xff0…

十五周算法训练营——BFS

今天是十五周算法训练营的第六周&#xff0c;主要讲BFS专题。&#xff08;欢迎加入十五周算法训练营&#xff0c;与小伙伴一起卷算法&#xff09; 「BFS的核心思想是把一些问题抽象成图&#xff0c;从一个点开始&#xff0c;向四周开始扩散。一般来说&#xff0c;写BFS算法都是…

3-Raven2百个靶机渗透(精写-思路为主)

特别注明&#xff1a;本文章只用于学习交流&#xff0c;不可用来从事违法犯罪活动&#xff0c;如使用者用来从事违法犯罪行为&#xff0c;一切与作者无关。 文章目录 前言一、信息收集二、ssh爆破尝试三、根据框架exp和cve拿shell四、对mysql的进一步渗透&#xff0c;mysql UD…

Python - 通过 pyInstaller 打包成可执行文件

一、场景 通常来说&#xff0c;我们开发的 python 脚本一般都会用到一些第三方的包&#xff0c;并且需要对应版本的 python 解释器。因此在 python 脚本在不同的主机上运行的时候相对来说不是很方便&#xff0c;为此可以通过 pyInstaller 将脚本和解释器打包成可执行文件&…

数字中国创新大赛·信创赛道优秀作品推荐 | 国产工业实时操作系统(Intewell)

产品介绍和功能体系 Intewell工业实时操作系统源于有30多年发展历史的“道”操作系统&#xff0c;是一款微内核实时操作系统&#xff08;RTOS&#xff09;&#xff0c;具有良好的可扩展性、友好的用户开发环境和丰富的开发调试工具&#xff0c;提供POSIX接口。Intewell工业实时…

2023年5月产品经理认证NPDP线上班,我要报名学习

产品经理国际资格认证NPDP是新产品开发方面的认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会&#xff08;PDMA&#xff09;成立于1979年&#xff0c;是…

程序设计的三种结构-C中实现其的6条语句

什么是程序设计结构? C语言设计出来就是为了解决现实中存在的问题&#xff0c;但是现实中问题大多较为复杂&#xff0c;如何描述问题也成为了一个重要的问题。将这些众多的问题核心找出来&#xff0c;我们发现只需要使用三种基本的结构包括&#xff1a;顺序结构&#xff0c;分…

FS4068四节锂电池充电管理控制芯片

FS4068 是一款工作于 2.7V 到 6.5V 的 PFM 升压型四节锂电池充电控制集成电路。 FS4068采用恒流和恒压模式对电池进行充电管理&#xff0c;内部集成有基准电压源&#xff0c; 电感电流检测单元&#xff0c;电池电压检测电路和外置场效应晶体管驱动电路等&#xff0c; 具有外部元…

面向开发者的 ChatGPT 提示工程

LLM 正在逐步改变人们的生活&#xff0c;而对于开发者&#xff0c;如何基于 LLM 提供的 API 接口快速、便捷地开发一些具备更强能力、集成 LLM 的应用&#xff0c;来便捷地实现一些更新颖、更实用的能力&#xff0c;是一个急需学习的重要能力。由巨佬吴恩达老师与 OpenAI 合作推…

Golang每日一练(leetDay0060) 多数元素、两数之和III

目录 169. 多数元素 Majority Element &#x1f31f; 170. 两数之和 III Two-sum-iii-data-structure-design &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏…

Zynq实现SDI视频解码PCIE传输 提供工程源码和QT上位机源码加技术支持

目录 1、前言2、我已有的SDI编解码方案3、我已有的PCIE方案4、基于zynq架构的PCIE5、总体设计思路和方案SDI摄像头Gv8601a单端转差GTX解串SDI解码VGA时序恢复YUV转RGB图像缓存PCIE发送通路SDI同步输出通路 6、vivado工程详解7、驱动安装8、QT上位机软件9、上板调试验证SDI同步H…

VMware虚拟机克隆、复制虚拟机

文章目录 为什么要克隆一、环境检查二、开始克隆三、网卡静态配置 为什么要克隆 首先VMware 上创建的虚拟机是可以重复使用的&#xff0c;安装好的虚拟机可以直接复制或者剪切到其它任意电脑上&#xff0c;然后使用 VMware 打开使用&#xff0c;两者的虚拟机设置以及登录密码都…

MySQL笔记(二) 数据库操纵语言DML 、数据库查询语言DQL、数据库控制语言DCL、计算字段、子查询、函数

MySQL笔记&#xff08;二&#xff09; 数据库操纵语言 DML插入数据 INSERT修改数据 UPDATE删除数据 DELETE 数据库查询语言DQL单表查询常用查询条件排序查询分组和分页查询限制结果 分页查询多表查询自身连接查询外连接查询嵌套查询 计算字段字段 field拼接 concatenateTrim()…

10个免费的ChatGPT镜像网站

文章目录 前言说明网站 前言 ChatGPT是一种基于OpenAI GPT&#xff08;Generative Pretrained Transformer&#xff09;模型的聊天机器人&#xff0c;它可以对用户提出的问题做出回答&#xff0c;同时还能够进行精准的语言理解和回复&#xff0c;较好地满足了人们与机器人之间…

MySQL数据库基础表格——增删改查(下)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️树高千尺&#xff0c;落叶归根人生不易&…

媒体邀约服务

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体邀约是什么&#xff1f;专业的媒体邀约服务包含哪些内容&#xff1f;怎么选择合适的媒体邀约服务机构&#xff1f; 今天胡老师就跟大家分享下这方面你的经验。 一&#xff0c;媒体邀…

【C++STL】AVL树

前言 二叉搜索树是具有特殊存储结构的树&#xff0c;任意根节点的左子树的所有节点值都比根节点的值小&#xff0c;右子树的所有节点值都比根节点大。 这种特殊的存储结构使得查找的效率大大提升&#xff0c;为logN。但是还有缺陷。 因为二叉搜索树的构建是一个节点一个节点的…

django 过往后端搭建笔记整理 (2)--rest_framework视图使用

rest_framework视图使用 CreateAPIView---单独执行post上传逻辑views.pyuser_serializers.py CreateAPIView—单独执行post上传逻辑 基本逻辑&#xff1a; ① 准备视图函数类 ② 准备序列化器类 &#xff08;其中可以自定义如何序列化数据、序列化哪些数据&#xff0c;以及如何…