SpringBoot启动流程分析知识点--@Transactional(二)

SpringBoot启动流程分析知识点--@Transactional(一) 官网:https://spring.io/projects/spring-data-jdbc。 阅读详情

SpringBoot启动流程分析知识点–@Transactional(二)

一、概述

源码基于SpringBoot 2.7.xx版本

官网:spring-data-jdbc

1.1 Spring 中的事务分类

  1. 🍑编程式事务(手动写代码操作事务)(了解)
  2. 🍑声明式事务(用注解自动开启和提交事务)(重点)

二、使用详解

2.1 事务传播机制

在使用事务时,如果一个事务方法调用另一个事务方法,那么不同事务之间的执行应该如何调度呢?这就是事务传播的作用,用来调度不同事务执行时的顺序和方式。
MySQL默认的事务传播机制是PROPAGATION_REQUIRED

类型说明
PROPAGATION_REQUIRED如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务
PROPAGATION_SUPPORTS如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行
PROPAGATION_MANDATORY如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常
PROPAGATION_REQUIRES_NEW创建一个新的事务,如果当前存在事务,则把当前事务挂起
NOT_SUPPORTED以非事务方式运行,如果当前存在事务,则把当前事务挂起
NEVER以非事务方式运行,如果当前存在事务,则抛出异常
NESTED如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行
1.PROPAGATION_REQUIRED=0:
如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
无父事务时:子事务作为独立事务执行
有父事务时:子事务中的操作串入父事务中执行,并且一起提交,一个操作失败全部回滚

2.PROPAGATION_SUPPORTS=1:
如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
无父事务时:以非事务方式执行
有父事务时:加入父事务执行,等同于PROPAGATION_REQUIRED

3.PROPAGATION_MANDATORY=2:
如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
无父事务时:抛出异常
有父事务时:加入父事务执行,等同于PROPAGATION_REQUIRED

4.PROPAGATION_REQUIRES_NEW=3:
创建一个新的事务,如果当前存在事务,则把当前事务挂起。
挂起(Suspend):通知TransactionManager不再检查某事务的状态,直到Resume
AbstractPlatformTransactionManager. handleExistingTransaction()

无父事务时:子事务新建事务作为独立事务执行
有父事务时:子事务新建事务作为独立事务执行,独立提交;

T1{ O(A); T2{ O(B); O(C); }; O(D);
};
如此示例:
子事务T2不受父事务T1回滚的影响,但仍作为T1的子逻辑,
O(D)失败,O(A)回滚,T2中的事务不回滚;
T2失败回滚,T1捕获异常后,可以选择提交或回滚,未捕获异常,同T2一起回滚。

5.NOT_SUPPORTED=4:

以非事务方式运行,如果当前存在事务,则把当前事务挂起。
无父事务时:以非事务方式执行
有父事务时:挂起父事务,自己按照无事务方式运行
子事务自身无回滚,出现异常若向上抛,可能导致父事务回滚
父事务回滚时,不会影响子事务。

6.NEVER=5:

以非事务方式运行,如果当前存在事务,则抛出异常。
无父事务时:以非事务方式执行
有父事务时:抛出异常(若不处理会导致父事务回滚)

7.NESTED=6:

如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行
无父事务时:创建独立事务,等同于PROPAGATION_REQUIRED
有父事务时:嵌套在父事务之内
子事务依赖父事务:子事务于父事务提交时提交;父事务回滚,子事务也回滚。
Savepoint:子事务回滚时,父事务不回滚

2.2 示例

  1. 编程式事务(手动写代码操作事务)(了解)

@Slf4j
@RestController
@RequestMapping("/trans")
public class TransactionController {
    @Autowired
    private UserService userService;
    //1、拿到事务管理器
    @Autowired
    private DataSourceTransactionManager dataSourceTransactionManager;
    //2、定义事务属性
    @Autowired
    private TransactionDefinition transactionDefinition;

    @RequestMapping("/addUser")
    public Integer addUser(String username, String password) {
        //3、开启事务
        TransactionStatus transaction = dataSourceTransactionManager.getTransaction(transactionDefinition);
        //4、插入数据
        User user = new User(username, password);
        Integer result = userService.insert(user);
        log.info("影响的行数是:" + result);
        //5、提交事务
        dataSourceTransactionManager.commit(transaction);
        //6、回滚事务
//        dataSourceTransactionManager.rollback(transaction);
        return result;
    }

}
  1. 声明式事务(用注解自动开启和提交事务)(重点)
    /**
 * 自动提交事务
 */
@Slf4j
@RestController
@RequestMapping("/trans")
public class TransactionController {
    @Autowired
    private UserService userService;

    // 声明式事务的实现很简单,只需要在需要的⽅法上添加 @Transactional 注解就可以实现了,⽆需⼿动
    // 开启事务和提交事务,进⼊⽅法时⾃动开启事务,⽅法执⾏完会⾃动提交事务;如果中途发⽣了没有处
    // 理的异常会⾃动回滚事务
    @RequestMapping("/addUser2")
    @Transactional
    public Integer addUser2(String username, String password) {
        // 插入数据
        User user = new User(username, password);
        Integer result = userService.insert(user);
        // 模拟异常
        int a = 10 / 0;
        return result;
    }
}
百度新闻评论内容抓取 通过抓包分析发现,百家号手机app端文章评论内容接口为:https://ext.baidu.com/api/comment/v1/comment/getlist?appid=101&sid=1008524_2-1010050_1-1007549_23033-1007550_23035&cuid=01B5EAF73E8A83BB842BE04E4FB6C656|23200201047... 阅读详情

相关推荐

火星遥感数据的获取与处理工具安装详解

有关火星遥感影像数据的那些事...

FengYingLuo的博客 5570

记一次 Spring Boot 中 @Transactional事务中使用内置锁限制总数失效的BUG

前言:业务需要,最多只能绑定5个,目前不考虑集群,单体服务下的内容 第一版代码: @Transactional(rollbackFor = {CommonException.class}, propagation = Propagation.REQUIRED) public Object bindCommonUsedPatient(CommonUsedPatientRequest c...

You can either travel or read,but either your body or soul must be on the way. 755

Codesys电子凸轮从入门到应用:手把手教你用MC_CamIn/MC_CamOut实现主从轴同步

本文详细介绍了如何在Codesys平台上使用MC_CamIn和MC_CamOut功能块实现电子凸轮的主从轴同步控制。从环境配置、轴使能到凸轮表创建与动态切换,提供了完整的程序编写指南和调试技巧,帮助工程师快速掌握工业自动化中的高精度运动控制技术。

weixin_26878995的博客 276

Spring-Transaction事务原理解析(结合源码)

事务管理是应用系统开发中必不可少的一部分。**Spring 为事务管理提供了丰富的功能支持**。Spring 事务管理分为编程式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;**声明式事务基于 AOP实现,将具体业务逻辑与事务处理解耦**。声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。声明式事务有两种方式,一种是在配置文件(xml)中做相关的事务规则声明,另一种是基于 @Transactional 注解的方式。本文将着重介绍基于 @Transactional 注解

一个小菜鸡罢了 2451

Fleury算法寻找欧拉回路(mtlab代码详解)

【代码】Fleury算法寻找欧拉回路(mtlab代码详解)

m0_63449998的博客 1295

从零构建:Simulink与PX4的快速原型开发实战

本文详细介绍了如何利用Simulink与PX4进行四旋翼无人机的快速原型开发,涵盖环境搭建、动力学建模、控制器设计、仿真验证及自动代码生成全流程。通过实战案例展示姿态控制器的实现与调试,帮助开发者高效完成从算法设计到硬件部署,显著提升开发效率并降低试错成本。

plant的博客 322

SpringBoot事务控制讲解

前言 本篇文章主要介绍的是SpringBoot的事物Transaction使用的教程。 SpringBoot Transaction 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码。 Transaction 事务管理方式 在Spring中,事务有两种实现方式,分别是编程式事务管理和声明式事务管理两种方式。 编程式事务管理: 编程式事务管理使用Transaction...

这里记录着我一点一滴的进步 1251

太美了!现代女主jk海军风穿搭四视图

哪个女孩子初高中的时候不买几套JK衣服啊,穿上完全是青春女孩。那还愣着干啥,不得也给你的漫剧女主也穿上!直接就是分享三套JK穿搭,红棕双麻花辫配经典水手服,是那种乖乖巧巧的元气学妹;粉色羊毛卷双马尾,搭配蝴蝶结和小挎包甜度直接拉满;还有灰棕色侧麻花辫,浅蓝上衣配黑色百褶裙,温柔里又带点小酷。下面把这三套角色的完整提示词分享出来,喜欢哪套就拿去参考,改改发型和配色,还能继续解锁新角色!

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 48

springboot 事务(@Transactional)

外部类调用:如果一个有事务的方法被另一个类的方法调用,事务传播可能会受到影响。自调用方法:如果一个带有事务的方法在同一个类中通过普通的方法调用自己,事务传播可能会失效。外部调用:如果一个有事务的方法被另一个没有事务的方法直接调用,事务传播可能会受到影响。在这种情况下,被调用的方法会在自己的事务中执行,而不是加入到外部方法的事务中。在springboot中,在方法或类上添加@Transactional注解,将会把该方法或类中的数据库操作放到一个事务中,中途发生异常时,则事务会回滚,代码如下。

lizsy的博客 1757

C# MES通信从入门到精通(1)——串口传输文件

本文详细介绍了在Mes通信领域如何使用串口发送文件,由实战经验总结,堪称MES通信领域的葵花宝典!

qq_34059233的博客 3745

发那科 Fanuc PLC 报文通讯,报文解析。附源程序

发那科 Fanuc PLC 报文通讯,最详细的发那科 PLC报文解析,不再局限在官方提供的库,也不用再局限在windows平台。

ITOfDragon的博客 1746

SpringBoot 中 @Transactional 的使用

SpringBoot中@Transactional注解是管理数据库事务的核心工具,确保ACID特性。文章详细介绍了其基本用法、核心属性及传播行为差异: 基础使用:通过@EnableTransactionManagement开启事务,在Service方法上添加@Transactional可实现事务管理,异常时自动回滚。 核心属性: propagation:控制事务边界(REQUIRED/REQUIRES_NEW等) isolation:设定事务隔离级别 timeout:设置事务超时时间 rollbackFor

qq_45464560的博客 2052

Windows Server 2016远程桌面服务配置和授权激活

Server 2016默认远程桌面连接数是2个用户,如果多余两个用户进行远程桌面连接时,系统就会提示超过连接数,可以通过添加远程桌面授权解决:1、添加远程桌面授权服务第一步:服务器管理 - 添加角色和功能打开添加角色和功能向导窗口,选择基于角色或给予功能安装:第二步:添加远程桌面会话主机和远程桌面授权功能:以上配置完成后即可使用多于2用户同时登陆,但使用期限为120天,再次登陆会有如下提示:2、添...

mahailiang的专栏 6万+

SpringBoot @Transactional 注解未生效

文章目录1. Spring 中使用事务管理的正确方式2. @Transactional 注解未生效的原因1. 数据库引擎不支持事务2. @Transactional 修饰非 public 方法3. @Transactional 修饰的方法未通过接口调用4. @Transactional 修饰的方法内部捕获异常 1. Spring 中使用事务管理的正确方式 2. @Transactional 注解未...

谈谈1974 7112

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SpringBoot中事务@Transactional的使用

Spring框架提供了便捷的事务管理。不会对业务调用造成任何干扰。不需要手动开启,提交事务,只需要在类或者方法上进行少量的注解就可以自动完成这些操作。本篇主要介绍了@Transactional注解的使用

妖怪的博客 1510

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

springboot 整合 mybatis(AOP、@Transactional事务 )

springboot 整合 mybatis(AOP、@Transactional事务 )

pig_ning的博客 597

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SpringBoot事务@transactional 失效分析-2

在 Spring Boot 中,注解用于声明事务,但实际开发中可能会遇到事务不生效的情况。这通常与 Spring 事务的实现原理、注解使用方式或环境配置有关。

quyunde的博客 873

SpringBoot中关于@Transactional的事务设置

关于@Transactional的事务设置,文章下面有测试参考

weixin_46025962的博客 830

springboot通过@Transactional注解使用事务

总结:springboot中在方法上(或类上)声明@Transactional注解即可在springboot中使用事务。 一。在Spring Boot中,当我们使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依赖的时候,框 架会自动默认分别注入DataSourceTransactionManager或JpaTransactionMa...

yzh_1346983557的博客 845

SpringBoot 中 @Transactional 的使用细节

1.spring boot 中事物的使用 (当前指代的不是多数据源,只有一个数据源的前提下) <1> 在springboot 启动类上加上允许使用事物注解 @EnableTransactionManagement <2> 就这么简单的一个操作,更主要的是了解@Transactional 的一些特性,到底该怎么使用,什么时候使用。 事物的四个特性想必大家应该都知道,...

小左的博客 2594

SpringBoot @Transactional

这几天在工作过程中,出现了@Transactional 注解没有生效的情况。于是打算系统的整理一下。 1 什么是 @Transactional 声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。 2 如何使用 @Transactional @Transactional(rollbackFor=Exception.class) 如果加了这个注解...

qq_38150250的博客 1843

专项攻克——spring、springMVC、springBoot、springCloud的启动流程

参考文献:https://blog.csdn.net/m0_47495420/article/details/114422268?

军威兄的博客 234

SpringBoot之事务管理@Transactional

以前学ssh ssm都有事务管理,service层通过在applicationContext.xml配置事务,所有service方法都加上事务操作; 用来保证一致性,即service方法里的多个dao操作,要么同时成功,要么同时失败; springboot下的话 搞一个@Transactional即可; 我们这里搞一个实例,转账实例,A用户转账给B用户xx元 设计如下: Account类(id 编...

JavaAlliance 832

SpringBoot 中 @Transactional 注解的使用

SpringBoot 中 @Transactional 注解的使用

_江屿_ 2696

Spring boot学习笔记之五:SpringBoot之事务管理@Transactional

1. 前言以前学ssh ssm都有事务管理service层,通过applicationContext.xml配置,在service类或所有service方法都加上事务操作;用来保证一致性,即service方法里的多个dao操作,要么同时成功,要么同时失败;springboot下的话 搞一个@Transactional即可,无需再进行配置2.编码我们这里搞一个实例,转账实例,A用户转账给B用户xx元...

HeJD的博客 3万+
上一篇: SpringBoot启动流程分析知识点--@Transactional(一)
下一篇: SpringBoot--扩展点
fanderboy
博客等级 码龄4年 356粉丝 20原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fanderboy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值