String 事务

news2024/9/20 16:54:03

目录

一、什么是事务

二、Spring事务的实现方式

1、编程式事务

2、声明式事务

三、自动操作事务的注解的三个属性

1、rollbackFor

2、isolation

3、propagation


前言:本文所见围绕的主题是事务,所以笔者先讲解什么是事务,先让大家了解事务,接着讲解在Spring中,如何对事务进行的实现,有两种方式,先讲手动创建的方式,再根据手动引出自动的方式,自动的方式是根据注解实现的,最后围绕注解再展开几个知识点~

一、什么是事务

例子:我们在王者荣耀里面充钱买皮肤这个行为,会包含几个操作:先充钱,再花钱购买皮肤,购买之后皮肤到达背包中,这几个操作缺一不可,如果你不充钱,就可以得到一个皮肤,腾讯怎么盈利?如果花了钱,却得不到皮肤,我们就白花钱了。。

我们进行的这一系列操作就是一个事务,事务具有原子性,要么这一组操作全部成功,要么全部失败~

那现在咱们知道了什么是事务,现在看一下,事务是如何操作的:

事务的操作主要有三步:
1. 开启事务:start transaction/ begin (⼀组操作前开启事务)
2. 提交事务: commit (这组操作全部成功, 提交事务)
3. 回滚事务: rollback (这组操作中间任何⼀个操作出现异常, 回滚事务)

在MySQL中我们学了事务了,对事物的应用不仅存在于数据库中,它可以遍布在生活中的各处,比如上述例子中的买皮肤,还要银行转账,商场买东西等等,所以它可以存在于Spring中,下面咱们来看看在Spring中,它是如何实现的~

二、Spring事务的实现方式

在Spring中一共有两种实现方式:1:编程式事务 2:声明式事务,第一种是手写代码去操作事务,第二种是通过注解自动操作事务。

1、编程式事务

通过代码操作事务,需要引入引入两个对象:DataSourceTransactionManager(事务管理器) 和 TransactionDefinition(事务属性)

进行以下操作:

开启事务:

TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);

提交事务:

dataSourceTransactionManager.commit(transactionStatus);

回滚事务:

dataSourceTransactionManager.rollback(transactionStatus);

完整的代码:

@Autowired
private DataSourceTransactionManager dataSourceTransactionManager;
@Autowired
private TransactionDefinition transactionDefinition;
@Autowired
private UserService userService;
 
public String registry(String name,String password){
    // 开启事务
    TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
    //业务逻辑 用户注册
    userService.registryUser(name,password);
    //提交事务
    dataSourceTransactionManager.commit(transactionStatus);
    //回滚事务
    //dataSourceTransactionManager.rollback(transactionStatus);
    return "注册成功";
}

使用编程式事务太麻烦了,下面咱们看看使用注解的方式

2、声明式事务

使用@Transactional注解,就可以自动开启事务,自动提交事务,当抛出异常后,自动回滚事务,注意:只有当抛出异常时,才会回滚,不管方法里面是否报错,因为报了错,在内部可以捕获,当然,如果没有报错,也想回滚,可以手动抛出异常~

@Autowired
private UserService userService;
 
@Transactional
public String registry(String name,String password){
    //⽤⼾注册
    userService.registryUser(name,password);
    return "注册成功";
}
@Autowired
private UserService userService;
 
@Transactional
public String registry(String name,String password){
    //⽤⼾注册
    userService.registryUser(name,password);
    log.info("⽤⼾数据插⼊成功");
     //对异常进⾏捕获
     try {
         //强制程序抛出异常
         int a = 10/0;
     }catch (Exception e){
         // ⼿动回滚事务
         TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
     }
    return "注册成功";
}

大概介绍一下 @Transactional注解吧

  • 可以修饰public方法
  • 它也可以修饰类,表明类下面的所有的public方法都可以自动操作事务;

三、自动操作事务的注解的三个属性

@Transcactional注解它有三个重要的属性:

rollbackFor,它是异常回滚属性,能够指定当方法抛出什么类型的异常,进行自动回滚操作。

Isolation,它用来设置事务的隔离级别。

propagation,它用来设置事务的传播机制。

1、rollbackFor

@Transcactional默认当抛出运行时异常和产生错误时,才会进行自动回滚,如果想要抛出其他类型异常,比如IOException异常也想回滚,就可以利用rollbackFor属性,设置值,rollbackFor = Exception.class,就可以只要抛出异常,不管什么类型,都可以回滚~

@Autowired
private UserService userService;
 
@Transactional(rollbackFor = Exception.class)
public String registry(String name,String password) throws IOException {
    //⽤⼾注册
    userService.registryUser(name,password);
    log.info("⽤⼾数据插⼊成功");
    if(true) {
        throw new IOException();
    }
    return "注册成功";
}

2、isolation

isolation可以设置隔离级别,先介绍一下事务隔离级别的概念,然后在介绍SQL中分别有几种级别,详细介绍一下这几种级别,最后介绍Spring中的隔离级别~

概念:

事务隔离指的是:当多个事务并发进行时,他们之间进行相互隔离

事务隔离程度指的是:事务在读取和修改数据时能够接触和修改其他事务所作的修改的程度

事务隔离的目的是确保事务进行并发进行时,能够正确执行,保证数据的一致性和可靠性,因为在一个并发环境中,多个事务同时进行时,可能同时修改和读取某些数据,如果不进行隔离,可能会产生一些问题,比如脏读,不可重复读,幻读。

SQL中事务的隔离级别(由低到高开始介绍):

  • 1、读取未提交(Read Uncommitted)

在该隔离级别下的事务可以看到其他事务未提交的数据,在这种级别下,如果某个未提交的数据,发生了回滚,但是有事务读取了,会造成脏读的问题,读取的这种数据叫做脏数据。(这是最低的隔离级别,并发性高,但是可靠性较差)

  • 2、读取已提交(Read Committed)

在该隔离级别下,事务可以读取其他事务已经提交的数据,这解决了脏读的问题,但是某个事物若进行多次重复的sql查询,可能会得到不同的结果,这可能会造成不可以重复读的问题

  • 3、可重复读(Repeatable Read)(MySQL中默认的事务隔离级别)

在该隔离级别下,在并发时,某个事物不会读到其他事物修改的数据,这就保证了数据的一致性,解决了不可以重复读的问题,但是又可能会造成幻读的问题,因为每次查询的都是同一组数据,有可能有事务在某一行插入了数据,但是我查询不到,我也就想在那一行插入插入,但是一直插入失败,这种现象叫做幻读。

  • 4、串行化(Serializable)

由于采用上述三种隔离级别,都可能会产生问题,所以使用串行化,会解决这些问题,因为这种是一个事务一个事务的进行,谁也根本干扰不到谁~ 但是这种级别性能太低,一般不会采取的~

Spring中的事务隔离级别:

一共有五种,多了一个DEFAULT级别,这个级别表示,当前连接的数据库是用的哪种隔离级别,就用哪种隔离级别~

Isolation.DEFAULT : 以连接的数据库的事务隔离级别为主
Isolation.READ_UNCOMMITTED:读未提交,对应SQL标准中 READ UNCOMMITTED
Isolation.READ_COMMITTED:读已提交,对应SQL标准中 READ COMMITTED
Isolation.REPEATABLE_READ:可重复读,对应SQL标准中 REPEATABLE READ
Isolation.SERIALIZABLE:串⾏化,对应SQL标准中 SERIALIZABLE
@Transactional(isolation = Isolation.READ_COMMITTED)

3、propagation

学会用这个属性,要先了解事务传播机制

要说传播,肯定是发生在多个实体之间,否则怎么能传播呢?

在Spring中事务可以用注解@Transactional声明方法,事务现在为方法服务,但是现在如果一个事务方法被另一个事务方法调用,那被调用的方法使用哪个事务呢?该怎么进行事务呢?这就用到了事务传播机制~ 一共有七种

现在有两个方法,一个是调用者,一个是被调用者,上图中的当前事务指的是调用者这个方法所用的事务

通过使用propagation属性,使用上面的值,可以指定传播方式

现在咱们重点讲解两种传播机制:REQUIRED(默认值)和REQUIRES_NEW

  • REQUIRED:被调用的方法如果使用的是这个传播机制,那么在被调用后,如果在调用者的方法使用了事务,那么被调用的方法使用对方的事务,如果调用者没有事务,则创建一个新的事务,共同使用~

特点:如果一个方法抛出了异常,那么所有参与其中的方法都会执行失败,发生回滚,因为所有方法使用的是同一个事务呀,要么同时成功,要么同时失败,这会保证数据的一致性~

  • REQUIRES_NEW:被调用的方法使用这个传播机制,那么被调用后,会创建新事务,不会使用对方的事务,互不干扰

 最后展示两个事务传播吧 :never和nested

  • never:使用了这种事务的传播后,被调用后,不允许调用者有使用事务,如果有,就抛出异常
  • nested:使用了这种事务传播后,被调用后,会使用调用者事务的子事务,子事务发生回滚,会使得父事务也发生回滚,并且如果还要其他方法也使用了父事务,也会连累其他方法执行失败~ 那该如何是好呢?可以只让当前的子事务的方法回滚,不影响父事务,怎么做的呢?在子事务的方法内,手动回滚。

那现在有个问题:nested和required的区别是什么?

使用nested会进行局部回滚,不会影响其他的事务发生回滚,而使用required不会局部回滚,一个事务回滚1,所有事物都要回滚,因为使用的是同一个事物。

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

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

相关文章

Selenium + Python 自动化测试15(模块化测试)

我们的目标是:按照这一套资料学习下来,大家可以独立完成自动化测试的任务。 上一篇我们讨论了使用SMTP 对象的sendmail 发送HTML报告的方法。 本篇文章我们接着讲测试代码的一些优化,提高我们测试代码的易读性,维护方便性。大家也…

ZooKeeper 集群的详细部署

ZooKeeper 集群部署 一、ZooKeeper 简介1.1 什么是 ZooKeeper1.2 ZooKeeper 特点 二 ZooKeeper 的架构和设计4.1 ZooKeeper 数据模型4.1.1 Znode 节点特性 三、ZooKeeper 的集群安装前准备工作3.1 需要的准备工作3.2 Linux 系统 3 个节点准备3.2.1 克隆3.2.2 配置另外两台服务器…

评论系统如何不崩溃?揭开海量评论背后的技术秘密

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! 大家好,我是小米!今天我们来聊聊一个非常实际的场景:海量新闻评论的入库问题。假设你在某个新闻平台工作,某条热门新闻突然火爆,用户的评论量如潮水…

SpringBoot Web开发(请求,响应,分层解耦)

Author_T17🥥 目录 一.请求响应概述 1.Servlet 2.DispatcherServlet 3.请求响应工作概图 4.BS/CS架构 二.API测试工具 三.请求 1.简单参数 (1)原始方式(不推荐) ​编辑 (2)Spring Boo…

【剑指 offer】删除链表中重复的结点

目 录 描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5 思路: 通过快慢…

2024年阳光电源社招校招入职测评:前程无忧智鼎题库全解析

在职场竞争日益激烈的今天,企业对人才的选拔标准越来越高。阳光电源,作为行业的领军企业,采用了前程无忧智鼎题库进行社招校招入职测评,旨在通过科学的方法选拔出与企业文化和价值观高度契合的人才。 测评概览 测评名称&#xff1…

大模型RAG企业级项目实战:Chatdoc智能助手文档(从零开始,适合新手)

大模型RAG企业级项目实战:Chatdoc智能助手文档(从零开始,适合新手) 大模型RAG企业级项目实战完整链接 LLM模型缺陷: ​ 知识是有局限性的(缺少垂直领域/非公开知识/数据安全) ​ 知识实时性(训练周期长、成本高) …

5计算机网络全面解析

网络功能和分类 计算机网络是计算机技术与通信技术相结合的产物,它实现了远程通信、远程信息处理和资源共享。 计算机网络的功能:数据通信、资源共享、管理集中化、实现分布式处理、负载均衡。 网络性能指标:速率、带宽(频带宽…

1.微服务发展阶段

单体应用阶段 简介 系统业务量很小的时候我们把所有的代码都放在一个项目中,然后将这个项目部署在一台服务器上,整个项目所有的服务都由这台服务器去提供 优点 1.展现层、控制层、持久层全都在一个应用里面,调用方便、快速,单个请…

Unity URP 曲面细分学习笔记

Unity URP 曲面细分学习笔记 1.曲面细分与镶嵌1.1 外壳着色器 Hull Shader1.2 镶嵌器阶段 Tessellator1.3 域着色器阶段 Domain Shader 2.具体实现2.1 不同的细分策略2.1.1 平面镶嵌 Flat Tessellation2.1.2 PN Tessellation(Per-Node Tessellation)2.1.…

NPM使用教程:从入门到精通

NPM使用教程:从入门到精通,掌握Node.js包管理神器 引言 随着Node.js的流行,JavaScript已经成为服务器端开发的主力军。NPM(Node Package Manager)作为Node.js的官方包管理工具,为开发者提供了一个庞大的代…

用R的界面来安装扩展包

下面内容摘录自《R 语言与数据科学的终极指南》专栏文章的部分内容,每篇文章都在 5000 字以上,质量平均分高达 94 分,看全文请点击下面链接: 2章4节:认识和安装R的扩展包,什么是模糊搜索安装,工…

Linux高级编程 8.12 标准IO

目录 一、标准io 二、文件 三、man手册 四、操作文件 1.fopen 2.fputc 3.fgetc 4.fgets 5.fputs 6.fread 7.fwrite 五、命令解读 1.显示目录下的文件信息命令 2.vimdiff小工具 3.stat命令 一、标准io IO: input output I: 键盘是标准输…

吃透张宇18讲+1000题,最后能考到110+吗?

张宇18讲太难了怎么办? 当然是换一本 不难的,张宇18讲的难度确实超过大多数同学能够接受的程度,张宇老师也说,默认大家基础已经很好,所以,如果你想很好的利用张宇18讲,必须要有一个一个很好的基…

ViT——探索自监督视觉Transformers在深度伪造检测中的应用

介绍 论文地址:https://arxiv.org/abs/2405.00355 在这篇评论文章中,我们研究了自监督、预训练Transformers与监督、预训练Transformers和传统神经网络(ConvNets)相比,在检测深度伪造方面的效果如何。 我们尤其关注…

开源的 P2P 跨平台传文件应用「GitHub 热点速览」

就在上周,发完那篇文章之后不久,我就有幸获得了 GitHub Models 服务公测的访问权限,所以就体验了一下 Playground 聊天功能。 起初,我以为这是“微软菩萨”降临,但玩了一圈下来,发现实际效果并没有那么惊艳…

❤️【接口测试面试】精选50接口测试面试题目,或许能帮到金九银十面试浪潮中的你❤️

基本理论知识 1、什么是(软件)接口测试? 接口测试:是测试系统组件间接口的一种测试方法 接口测试的重点:检查数据的交换,数据传递的正确性,以及接口间的逻辑依赖关系 接口测试的意义:在较早期开展,在软…

iPhone官方商店软件下载---免费看各种剧第⑤弹【iOS版包括iPad】

①点击iPhone自带软件App Store ②点击搜索,输入“周末趣味活动” ,点击下载到手机 ③进入软件页面后,我们需要激活页面,点击“feedback” ,输入“周六日”,点击“summit” ④等软件闪退后,再点…

智能化清理C盘的方法 小白也可以轻松清理C盘了 不再担心误删文件

智能化清理C盘的方法 小白用户也可以轻松清理C盘了 不再担心误删文件。对于电脑小白来说,C盘清理是一个大大的问题,因为大家都不知道C盘里有哪些文件可以删除,哪些不能删除,所以就直接的导致大家不可能去清理c盘垃圾。 就算是C盘…

一次sql请求,返回分页数据和总条数

日常搬砖,总少不了需要获取分页数据和总行数。 一直以来的实践是编码两次sql请求,分别拉分页数据和totalCount。 最近我在思考: 常规实践为什么不是 在一次sql请求中中执行多次sql查询或多次更新,显而易见的优势: ① 能…