[spring]spring事务和事务传播机制

news2024/11/28 4:26:57

文章目录

  • 一. 事务
  • Spring中的事务实现
    • 编程式事务
    • 声明式事务@Transactional
    • @Transactional作用
  • @Transactional详解
    • 1. rollbackFor
    • 2. 事务隔离级别
      • mysql事务隔离级别
      • Spring事务隔离级别
    • 3. 事务传播机制
      • 什么是事务传播机制
      • 事务传播机制有哪些
      • Spring事务传播机制使用
        • REQUIRED(加入事务)
        • REQUIRES_NEW(新建事务)
        • NEVER(不支持当前事务,抛异常)
        • NESTED(嵌套事务)

一. 事务

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

Spring中的事务实现

在这里插入图片描述

编程式事务

在这里插入图片描述
在这里插入图片描述
提交:

@RequestMapping("/user")
@RestController
public class UserController {
    //JDBC事务管理器
    @Autowired
    private DataSourceTransactionManager dataSourceTransactionManager;

    //定义事务属性
    @Autowired
    private TransactionDefinition transactionDefinition;

    @Autowired
    private UserInfoService userInfoService;

    @RequestMapping("/registry")
    public String registry(String name, String password){
        //开启事务
        TransactionStatus transactionStatus = dataSourceTransactionManager
                .getTransaction(transactionDefinition);
        //用户注册
        userInfoService.registryUser(name,password);
        //提交事务
        dataSourceTransactionManager.commit(transactionStatus);
        return "注册成功";
    }
}

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

回滚:
在这里插入图片描述

在这里插入图片描述
数据库中并没有添加

声明式事务@Transactional

添加依赖:

<dependency>
 <groupId>org.springframework</groupId>
 <artifactId>spring-tx</artifactId>
 </dependency>

在这里插入图片描述

添加注解:

@RequestMapping("/user")
@RestController
public class UserController {
    @Autowired
    private UserInfoService userInfoService;
    
    @Transactional
    @RequestMapping("/registry")
    public String registry(String name, String password) {
        userInfoService.registryUser(name, password);
        return "注册成功";
    }

在这里插入图片描述
抛出异常:
在这里插入图片描述
在这里插入图片描述
事务回滚, 没有提交, 数据库没有添加数据

@Transactional作用

在这里插入图片描述
在这里插入图片描述
异常被捕获住:
在这里插入图片描述
在这里插入图片描述
会提交

如果想要异常被捕获了, 但是事务依然回滚, 有两种方式:

  1. 重新抛出异常
    在这里插入图片描述
  2. 手动回滚事务
    在这里插入图片描述
    在这里插入图片描述

@Transactional详解

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

1. rollbackFor

@Transactional默认只在遇到运行时异常RuntimeException和Error时才会回滚, 非运行时异常不回滚
在这里插入图片描述
如果我们需要让所有异常都回滚, 需要配置@Transactional注解中的rollbackFor属性, 通过rollbackFor这个属性指定出现何种异常类型时事务进行回滚
在这里插入图片描述
在这里插入图片描述

2. 事务隔离级别

mysql事务隔离级别

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

Spring事务隔离级别

在这里插入图片描述
在这里插入图片描述
Spring事务隔离级别可以通过@Transactional中的isolation属性进行设置
在这里插入图片描述

3. 事务传播机制

什么是事务传播机制

事务传播机制就是:多个事务⽅法存在调⽤关系时,事务是如何在这些⽅法间进⾏传播的
在这里插入图片描述
事务隔离级别是解决多个书屋同时调用一个数据库的问题
在这里插入图片描述

事务传播机制解决的是一个事务在多个节点(方法)中的传递问题
在这里插入图片描述

事务传播机制有哪些

@Transactinal注解致辞书屋传播是指的设置, 通过propagation属性来指定传播行为
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Spring事务传播机制使用

REQUIRED(加入事务)

在这里插入图片描述

@RestController
@RequestMapping("/propaga")
public class PropagationController {
    @Autowired
    private UserInfoService userInfoService;
    @Autowired
    private LogInfoService logInfoService;

    @RequestMapping("/r1")
    @Transactional(propagation = Propagation.REQUIRED)
    public String r1(String name, String password){
        //用户注册
        userInfoService.registryUser(name, password);
        //记录操作日志
        logInfoService.insertLog(name, "用户注册");
        return "r1";
    }
}

@Service
public class UserInfoService {
    @Autowired
    private UserInfoMapper userInfoMapper;
    @Transactional(propagation = Propagation.REQUIRED)
    public void registryUser(String name, String password){
        userInfoMapper.insert(name, password);
    }
}

@Service
public class LogInfoService {
    @Autowired
    private LogInfoMapper logInfoMapper;
    @Transactional(propagation = Propagation.REQUIRED)
    public void insertLog(String name, String op){
    //出现异常
        int a = 10/0;
        logInfoMapper.insertLog(name,op);
    }
}

在这里插入图片描述
只创建了一个事务, 并且事务并没有提交, 数据库中也没有更新数据

流程描述:

  1. r1⽅法开始事务
  2. ⽤⼾注册,插⼊⼀条数据(执⾏成功)(和r1使⽤同⼀个事务)
  3. 记录操作⽇志,插⼊⼀条数据(出现异常,执⾏失败)(和r1使⽤同⼀个事务)
  4. 因为步骤3出现异常,事务回滚.步骤2和3使⽤同⼀个事务,所以步骤2的数据也回滚了
REQUIRES_NEW(新建事务)

将事务传播机制改成Propagation.REQUIRES_NEW
在这里插入图片描述
用户数据插入成功, 日志表数据发生异常, 插入失败
在这里插入图片描述

NEVER(不支持当前事务,抛异常)

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

程序执行报错
在这里插入图片描述

NESTED(嵌套事务)

在这里插入图片描述
在这里插入图片描述
r1事务可以认为是⽗事务,嵌套事务是⼦事务.⽗事务出现异常,⼦事务也会回滚,⼦事务出现异常,如
果不进⾏处理,也会导致⽗事务回滚

在这里插入图片描述

NESTED和REQUIRED的区别
在LogInfoService中进行捕获异常, 并进行当前事务回滚
在这里插入图片描述
在这里插入图片描述
发现 用户表提交成功, 但是日志表提交失败
由于LogInfoService已经捕获了异常, 所以不会导致r1父事务回滚, r1正常提交
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

【翻译】自定义 Qt Designer 窗体

原文地址&#xff1a;Customizing Qt Widgets Designer Forms 【翻译】Qt Designer 最新中文手册文档&#xff08;Qt6&#xff09; Qt Designer设计窗体保存为一个UI文件时&#xff0c;一些窗体设定参数&#xff0c;比如栅格、默认布局的边距&#xff08;margin&#xff09;和间…

【cpp】模板函数 模板类 特化 书写格式备忘

outline 收集的关于使用 模板函数 模板类 特化 偏特化的笔记 用以快速回忆 模板类 普通使用 类内定义成员函数 #include <iostream> using namespace std;template <typename T> class MyContainer { private:T element;public:MyContainer(T elem) : element(…

低代码可视化-uniapp商城首页小程序-代码生成器

在设计一个小程序的首页时&#xff0c;包含轮播图、通知栏和商品列表这三个元素是非常常见且有效的布局方式。这样的设计既能够吸引用户的注意力&#xff0c;又能够高效地展示信息和商品。 轮播组件 小程序首页幻灯片通常位于小程序的顶部或显著位置&#xff0c;通过滑动屏幕可…

selenium自动化测试之Junit

1. 常用的注解 将junit的索引添加到pom文件&#xff1a; <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId&…

看镭速如何解决半导体行业跨国传输大文件效率低的难题

随着全球经济的融合&#xff0c;半导体行业迎来了迅猛的发展&#xff0c;跨国合作变得司空见惯。相应地&#xff0c;跨国大文件传输的需求也在持续增长。不过&#xff0c;半导体行业在跨国传输大文件时&#xff0c;常常遇到效率不高和安全难以保障的问题。因此&#xff0c;半导…

H3C IPsec+IKE 野蛮模式配置实验

H3C IPsecIKE 野蛮模式配置实验 实验拓扑 ​​ 实验需求 按照图示配置 IP 地址&#xff0c;R3出接口自动获取公网IP地址在 R1 上配置默认路由连通公网在 R1 和 R3 上配置 IPsec VPN&#xff0c;使两端私网可以互相访问 实验步骤 按照图示配置 IP 地址&#xff0c;R3出接口…

上传图片到github上,生成链接在Typora中使用(解决Typora的md文件在分享时的丢失问题)

上传图片到github上,生成链接在Typora中使用(解决Typora的md文件在分享时的丢失问题) 在GitHub上从操作 创建一个 GitHub 仓库: 登录 GitHub,创建一个新的仓库来存储图片。 生成 GitHub 令牌: 在 GitHub 中,前往“Settings” > “Developer settings” > “Pers…

Rpc框架开发——客户端框架设计

目录 一、Requestor 二、RpcCaller 三、Publish_Subscribe 四、Registry-Discovery 五、Client 在客户端的模块划分中&#xff0c;基于以上理解的功能&#xff0c;可以划分出这么几个模块 Protocol&#xff1a;应用层通信协议模块 Network&#xff1a;网络通信模块 Disp…

前端vue部署网站

这里讲解一下前端vue框架部署网站&#xff0c;使用工具是 xshell 和 xftp &#xff08;大家去官网安装免费版的就行了&#xff09; 服务器 我使用的阿里云服务器&#xff0c;买的是 99 一年的&#xff0c;淘宝有新手9.9 一个月服务器。可以去用&#xff0c;学生的话是有免费三…

进程状态|进程优先级

目录 一、进程状态 1.什么是进程状态 2.进程状态都包含什么&#xff1f; 3.进程状态的查看 4.进程退出 &#xff08;1&#xff09;进程退出的步骤 &#xff08;2&#xff09;僵尸进程 &#xff08;3&#xff09;孤儿进程 二、进程优先级 1.进程优先级是什么&#xff…

二分查找一>0~n-1中缺失的数字(点名)

1.题目&#xff1a; 2.解析&#xff1a;方法一&#xff1a;用哈希表&#xff1a;记录存在的数字&#xff0c;找到哈希表为空的数字输出 Set<Integer> set new HashSet<>();for(int x : records) set.add(x);for(int i 0; i < set.size(); i){if(!set.contain…

重新学习Mysql数据库3:Mysql存储引擎与数据存储原理

本文转自互联网 本系列文章将整理到我在GitHub上的《Java面试指南》仓库&#xff0c;更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star哈 文章首发于我的个人博客&#xff1a; www.how2playlife.com 本文是微信公众号【Java技术江湖…

STM32与QT实现串口传输结构体含源码

文章目录 一. 关于数据传输的方式1.1 基本数据类型传输1.2 结构体传输 二. STM32与QT实现串口传输结构体实例2.1 下位机的实现2.2 上位机的实现2.3 演示Demo 三. 注意事项3.1 关于字节对齐问题3.2 关于大小端问题 一. 关于数据传输的方式 在日常开发过程中&#xff0c;我们时常…

使用aloam跑hesai Pandar-XT32激光雷达数据

参考自利用aloam跑数据集_aloam数据集-CSDN博客 第一步&#xff1a;查看bag的信息 输入rosbag info来查看bag包的信息&#xff1a; joeyjoey-Legion-Y7000P-IRX9:~$ rosbag info /home/joey/Downloads/data2022/indoor/LiDAR_IMU.bag path: /home/joey/Downloads/da…

Java_EE 多线程技术(Thread)

多线程与并发编程 多线程介绍什么是程序&#xff1f;程序&#xff08;Program&#xff09;是一个静态的概念&#xff0c;一般对应于操作系统中的一个可执行文件。什么是进程?执行中的程序叫做进程(Process)&#xff0c;是一个动态的概念。其实进程就是一个在内存中独立运行的程…

2025秋招倒计时---招联金融

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递&#xff09; 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…

股市期市内外盘高频分钟tick及均线策略分享

【数据库】银河金融数据库&#xff08;yinhedata.com&#xff09;可以获取大量历史行情数据&#xff0c;包含分钟&#xff0c;tick&#xff0c;日。不限于国内外&#xff0c;股票期货基金&#xff0c;ETF、期权等 【策略分享】一、引言均线策略作为技术分析的重要工具&#xff…

Kubesphere4.1插件网关、devops控制页面白页面问题解决

在使用Kubesphere4.1版本时&#xff0c;安装完成devops插件后‘DevOps项目’管理页面出现白页面&#xff0c;无法进行配置。包括网关等控制页面都会出现白页面。 经过查看版本信息发现是4.1版本存在问题&#xff0c;目前不支持。 处理问题&#xff1a; 目前 Kubesphere发布了4…

【软件测试】最佳软件测试基础入门教程

目录 前言一、顺序式开发模型二、 瀑布模型三 、V型模型四、迭代和增量开发模型五、 项目和产品背景下的软件开发 前言 软件开发生命周期的测试 本章简要介绍了软件开发项目中常用的生命周期模型&#xff0c;并解释了测试在每个模型中扮演的角色。它讨论了各种测试级别和测试…

python-PyQt项目实战案例:制作一个简单的图像处理工具

文章目录 1.设计UI2.编写功能代码2.1 初始化ui界面及类成员参数2.2 添加菜单栏2.3 建立信号/槽连接 3.主要功能代码及效果4.设置图像自动调节长宽尺寸但不改变长宽比例参考文献 1.设计UI 对于UI的设计可以通过qt designer直接绘制&#xff0c;也可以通过编写python代码实现。当…