Spring事务传播机制

hi ,大家好,继续为大家带来Spring事务传播机制的相关知识
在这里插入图片描述

文章目录

  • 🤗1.事务传播机制是什么
  • 🤗2.事务传播机制作用
  • 🤗3.事务传播机制

🤗1.事务传播机制是什么

定义了多个包含了事务的⽅法,相互调⽤时,事务是如何在这些⽅法间进⾏传递的

🤗2.事务传播机制作用

事务隔离级别是保证多个并发事务执⾏的可控性的(稳定性的),而事务传播机制是保证⼀个事务在多个调用方法间的可控性的(稳定性的)
在这里插入图片描述上面的图片很好的解释了事务传播机制和事务隔离级别的流程

🤗3.事务传播机制

Spring事务传播机制定义了在多个事务方法相互调用时,不同事务方法间事务处理的行为方式。Spring框架提供了7种不同的事务传播行为方式,分别是:

  1. REQUIRED:默认的传播行为,如果当前存在事务,则加入该事务,否则创建一个新事务。
    在这里插入图片描述
    这个来通俗的解释一下,如果当前方法没有开启事务,就会创建一个新的事务,如果存在事务就会加入该事务
    在这里插入图片描述
    我们在用代码验证一下
    在这里插入图片描述
    在这里插入图片描述
    因为此时的级别默认是required,所以应该是一个大事务,有一个有异常 ,其余的也就添加失败
    在这里插入图片描述

在这里插入图片描述
可以从数据库中看到,并未添加数据

  1. SUPPORTS:如果当前存在事务,则加入该事务,否则不使用事务。
    在这里插入图片描述
    如果A 没有开启事务,那么就以非事务的方式运行,后面的方法看到该调用链没有事务就也会摆烂,因此即使报了异常,也继续添加,
    看代码
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
3 MANDATORY:当前方法必须在事务中执行,存在事务,就会加入该事务,如果不存在事务,则抛出异常。

4.REQUIRES_NEW:表示创建⼀个新的事务,如果当前存在事务,则把当前事务挂起。也就是说不管外部⽅法是否开启事务,Propagation.REQUIRES_NEW 修饰的内部⽅法会新开启⾃⼰的事务,且开启的事务相互独⽴,互不⼲扰。

5.NOT_SUPPORTED:以⾮事务⽅式运⾏,如果当前存在事务,则把当前事务挂起

6.NEVER:当前方法不能在事务中执行,如果存在事务,则抛出异常。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
可以清楚的看到没有插入
在这里插入图片描述
控制台连受影响的行数都没有打印,直接抛出异常

这个NESTED比较绕😭,我们一起努力,冲冲冲!😜

7.NESTED:创建一个嵌套事务,如果当前存在事务,则将该事务作为嵌套事务的父事务,如果父事务提交,则嵌套事务会提交,否则回滚。
如果当前没有事务,则该取值等价于 PROPAGATION_REQUIRED。
执行流程
在这里插入图片描述

当没有事务,创建事务,后续方法会生成嵌套事务,并且有一个保存点,一旦该事务出现问题,就会回滚到上一个事务保存点,不会影响其他事务的执行

package com.example.demo.controller;import com.example.demo.model.Userinfo;
import com.example.demo.service.UserService;
import org.apache.catalina.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.util.pattern.PathPattern;//测试类@RestController@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@RequestMapping("/add")@Transactional(propagation = Propagation.REQUIRED)public  int  add(){Userinfo userinfo=new Userinfo();userinfo.setUsername("老七");userinfo.setPassword("123");int result=    userService.add(userinfo);System.out.println("受影响的行数是"+result);userService.insert(userinfo);return result;}
}
package com.example.demo.service;import com.example.demo.mapper.UserMapper;
import com.example.demo.model.Userinfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;@Transactional(propagation = Propagation.NESTED)public int  add(Userinfo userinfo){int result=userMapper.add(userinfo);System.out.println("受影响的行数"+result);return  result;}@Transactional(propagation = Propagation.NESTED)public int insert(Userinfo userinfo){int result=userMapper.add(userinfo);System.out.println("受影响的行数"+result);int num=10/0;return  result;}
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
数据库是啥也没插入的,为啥呢?不是说会回滚到上一个事务保存点吗?所以应该插入一条,为啥一条也没有
因为:在这里插入图片描述
第三个出了问题,那么创建事务的作为调用方,一定可以感知到异常,那么整个事务就会回滚,所以一条都不会插入
所以某个方法报异常不要让总的调用者感知到,就不会全部回滚,那么可以采用如下方式
在这里插入图片描述
修改这里的代码,让该方法感知到异常即可,不让总方法感知到,那么就会执行回滚操作,回滚到上一个事务保存点,所以只会插入一条数据

在这里插入图片描述
在写这个例子的时候,我们特意修改,不在add方法里面调用insert方法,而是在userController中调用,为什么呢?
🤗🤗🤗因为NESTED嵌套NESTED的时候,上一个NESTED保存点设置不上,这两个保存点会进行合并,合并成一个临时任务,那么一个挂掉,两个都挂了,所以在总的调用方法中调用它,才能有效果
再举一个例子:

公司雇了一个清洁工A,清洁工自己有又雇了一个清洁工B,当清洁B干了坏事,那么公司就会把A和B同时开除,当公司雇了两个清洁工,其中一个清洁工出了问题,就开掉出问题的那个就好,没出问题的留下~

这个例子就对应了代码的执行过程~

今天就讲到这里,我们下期再见,886!
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android复习(Android基础-四大组件)——Broadcast

1. 广播分类 广播的发送方式:标准广播、有序广播、粘性广播广播的类型:系统广播、本地广播 1.1 标准广播 完全异步,无序的广播发出后,所有的广播接收器几乎都会在同一时间收到消息。(异步)但是消息无法截…

对比学习论文综述总结

第一阶段:百花齐放(18-19中) 有InstDisc(Instance Discrimination)、CPC、CMC代表工作。在这个阶段方法模型都还没有统一,目标函数也没有统一,代理任务也没有统一,所以说是一个百花齐放的时代 1 判别式代理任务---个体判别任务 1.1 Inst Dict---一个编码器+一个memory…

【网络层+数据链路层】深入理解IP协议和MAC帧协议的基本原理

文章目录 前言一、IP协议二、MAC帧协议 1.以太网2.以太网帧(MAC帧)格式报头3.基于协议讲解局域网转发的原理总结 前言 为什么经常将TCP/IP放在一起呢?这是因为IP层的核心工作就是通过IP地址来定位主机的,具有将一个数据报从A主机…

面试热题(单词搜索)

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相…

【Python机器学习】实验11 神经网络-感知器

文章目录 人工神经网络感知机二分类模型算法 1. 基于手写代码的感知器模型1.1 数据读取1.2 构建感知器模型1.3 实例化模型并训练模型1.4 可视化 2. 基于sklearn的感知器实现2.1 数据获取与前面相同2.2 导入类库2.3 实例化感知器2.4 采用数据拟合感知器2.5 可视化 实验1 将上面数…

创建Azure资源锁

锁的介绍 在Azure中,资源锁是一种用于保护订阅、资源组或者单个资源的机制。它可以防止对受锁定的资源进行删除或修改操作,帮助确保资源的连续可用性和安全性。 Azure中的资源锁可以分为两种类型: 删除锁(CanNotDelete&#xf…

nodejs+vue+elementui考研互助交流网站

语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode 前端nodejsvueelementui,该系统采用vue技术和B/S结构进行开发设计,后台使用MySQL数据库进行数据存储。系统主要分为两大模…

【Spring Cloud Alibaba】RocketMQ的基础使用,如何发送消息和消费消息

在现代分布式架构的开发中,消息队列扮演着至关重要的角色,用于解耦系统组件、保障可靠性以及实现异步通信。RocketMQ作为一款开源的分布式消息中间件,凭借其高性能、高可用性和良好的扩展性,成为了众多企业在构建高可靠性、高吞吐…

allure相关笔记

allure.epic:最高级别的分类,表示一个大的功能、模块或业务场景。功能模块 allure.feature:表示一个功能模块或业务子场景,位于史诗下。主流程 allure.story:表示一个具体的测试场景,位于特性下。具体主流程…

时序预测 | MATLAB实现基于BP神经网络的时间序列预测-递归预测未来(多指标评价)

时序预测 | MATLAB实现基于BP神经网络的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于BP神经网络的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 Matlab实现BP神经网络时间序列预测未来(完整…

ssm+vue基于java的健身房管理系统源码和论文PPT

ssmvue基于java的健身房管理系统源码和论文PPT015 开发工具:idea 数据库mysql5.7(mysql5.7最佳) 数据库链接工具:navcat,小海豚等 开发技术:java ssm tomcat8.5 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统…

SpringBoot获取Request的3种方法!

作者 | 磊哥 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) HttpServletRequest 简称 Request,它是一个 Servlet API 提供的对象,用于获取客户端发起的 HTTP …