(保姆级教程)Mysql中事务的概念,什么是事务,如何使用事务,以及事务的隔离级别,什么是脏读、幻读,代码演示

news2024/9/25 5:22:12

继续讲解 Mysql 数据库中最重要的一个概念:事务

文章目录

    • 事务
      • 1.1 什么是事务
      • 1.2 执行原理
      • 1.3 如何操作事务
      • 1.4 事务的特点(ACID原则)
      • 1.5 事务并发
      • 1.6 事务隔离级别
        • 1.6.1 事务并发问题操作演示
        • 1.6.2 脏读演示
        • 1.6.3 不可重复读演示
        • 1.6.4 幻读演示

事务

1.1 什么是事务

1、事务是构成多用户使用数据库的基础。

2、举个例子来理解事务:

例子:向公司添加一名新的员工,这个过程大致分为这三步:在数据库中创建一条新的记录 ----> 为新员工添加部门 ----> 建立他的工资和奖金记录。

如果这 3 步中任何一步失败,则系统就必须撤销在此之前所有的变化,删除所有不完整记录的痕迹。这 3 个任务就构成了一个事务,其中任何一个任务的失败都会导致整个事务被撤销。

3、事务:是原子操作,是一个最小执行单元,由一个或多个 SQL 语句组成。这个单元中的每个 SQL 语句是相互依赖的,而且单元作为一个整体是不可分割的。如果单元中的一个语句不能完成,整个单元就会回滚(撤销),所有影响到的数据将返回到事务开始以前的状态。

4、简单总结事务的定义:

  • 一个数据库操作序列
  • 一个不可分割的工作单位
  • 恢复和并发控制的基本单位

事务和程序的比较:

  • 在关系数据库中,一个事务可以是一条或多条 SQL 语句,也可以包含一个或多个程序。
  • 一个程序通常包含多个事务。

1.2 执行原理

1、数据库会为每一个客户端都维护 一个独立空间的缓存区(回滚段)

2、一个事务中所有的 增删改 语句的执行结果会先缓存在回滚段中,而不是持久化到数据库中(查询不存在事务,不影响)

  • 成功:当事务中所有 SQL 语句均正常结束(commit),才会将回滚段中的数据同步到数据库。
  • 失败:整个事务将回滚(rollback)

1.3 如何操作事务

1、默认情况下事务是自动提交的(比如:你写一个 SQL 语句,在没有开始事务的情况下,就默认提交了,假如后面 SQL 语句有问题,前面的需要回滚,但是你已经提交了,就回滚不了了,所以这样不行)

事务开始:设置事务为手动提交set autocommit=0; 0 表示手动提交,1 表示自动提交

事务结束:分为两种情况:

  • 提交事务,事务就结束了,命令为:commit;
  • 回滚事务,事务也结束了,命令为:rollback;

2、未来在 java 代码中的操作

try{
    执行事务
     //上面没报错就提交事务   
    提交事务
} catch() {
    回滚事务
}

1.4 事务的特点(ACID原则)

原子性(Atomicity):表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败。

一致性(Consistency):表示一个事务内有一个操作失败时,所有更改过的数据都必须回滚到修改前的状态。

隔离性(Isolation):指一个事务的操作不能影响到另外一个事务的执行。

持久性(Durability):指即使系统崩溃,一个提交的事务仍然存在(也就是说:一个事务操作完成对数据库的影响是永久的)

1.5 事务并发

什么是事务并发:多个人(人:事务)同时操作同一个表中的数据。

带来的问题:

  • 脏读: 事务A读到了事务B未提交保存的数据。

    举例:比如账户里面有800块钱,此时事务A正常读。但是此时事务B给账户加了200块钱,事务A再读时,读到了1000块钱,但是现在事务B要回滚,这200块没有成功,但是事务A读到了,这不允许,因为事务A读取到了一个不存在的脏数据。

  • 不可重复读: 事务A在同一个事务中,因为事务B修改了数据,并提交了,同样的条件下,造成事务A两次读取到的数据不一致。

    例如:事务在 T1 时间读取到了某一行数据, 在 T2 时间重新读取这一行时候,这一行的数据已经发生修改,所以再次读取时得到了一个和 T1 查询时不同的结果。(因为中间有其他事务提交了 修改

  • 幻读: 事务A在同一个事务中,因为事务B新增了数据,并提交了,如果事务A修改数据, 会出现多修改了一条数据,出现幻觉。

    第一次和第二次读出来的记录数不一样。(因为中间有其他事务提交了 插入/删除

区别:

  • 不可重复读:重点是修改,读的数据不一样;
  • 幻读:重点是新增或者是修改,读的记录数不一样。

1.6 事务隔离级别

使用事务隔离级别来解决:读未提交: read uncommitted、读已提交: read committed、可重复读(mysql 默认的隔离级别): repeatable read、串行化: serializable

×:不能解决 √:能解决
脏读不可重复读幻读
读未提交×××
读已提交××
可重复读×
串行化

命令行查看事务隔离级别的时候报错:

原因:老版本 MySQL 比如 5 中用的是 tx_isolation,而应该是在 5.7.20 版本之后,用的是 transaction_isolation。 所以:在 MySQL 8 及之后的版本中,只需将语句中的 tx_isolation 替换为 transaction_isolation 即可:

每启动一个 MySQL 程序,就会获得一个单独的数据库连接

-- 查看当前的隔离级别
select @@transaction_isolation;
-- 设置当前mysql连接的隔离级别(session表示连接的当前窗口)
set session transaction isolation level 隔离级别的英文名称;
-- 设置数据库系统全局的隔离级别
set global transaction isolation level 隔离级别的英文名称;
1.6.1 事务并发问题操作演示

下面进行实际操作演示事务并发:由于 navicat 中无法演示不同事务,这里直接开两个 cmd 窗口来演示不同的事务。
在这里插入图片描述
事务并发操作的表为:
> ](https://img-blog.csdnimg.cn/a77cc1f714d24419b704818fd0824f29.png)

1.6.2 脏读演示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每个问题的演示都要设置为手动提交:每个事务都需要。

但是设置隔离级别,这里只设置了出现问题的事务(比如:事务A,最好每个事务也设置下)


在这里插入图片描述

这也出现了另外一个问题,同一个事务内,事务A三次读取的数据不一样,导致不可重复读

怎么解决脏读? 设置隔离级别:读已提交:read committed(这里只给事务A设置了隔离,也可以给B设置同样的隔离级别)

在这里插入图片描述

1.6.3 不可重复读演示

在这里插入图片描述

解决: 设置隔离级别:可重复读 repeatable read

在这里插入图片描述

1.6.4 幻读演示

在这里插入图片描述

注意:幻读在实际开发中是可以接收的

解决: 设置隔离级别:serializable。一般不用解决

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

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

相关文章

CANdelaStudio 使用教程 1

文章目录 CANdelaStudio 软件下载CANdelaStudio 软件的权限View Edition 和 Admin Edition 区别:打开文件 CDD / CDDT 文件新建 CDD 文件新建 CDDT 文件CDD 和 CDDT 文件的区别 CANdelaStudio 软件下载 1、 来到 Vector 官网下载中心 https://www.vector.com/cn/zh…

网工内推 | Base北京,国企网工运维,最高30k*14薪,IE认证优先

01 万方数据股份有限公司 招聘岗位:网络工程师 职责描述: 1.负责完成基础网络组网工作; 2.负责网络对象的访问控制及安全策略,配置VLan,黑白名单、地址转换、故障排查及网络安全监控工作; 3.负责对操作系…

如何在AD上创建完整的项目

首先,我们先安装好AD,这里我使用的是AD22,安装过程如下: Altium Designer 22下载安装教程-CSDN博客 Altium Designer 22是全球领先的PCB设计软件之一,为电路板设计师提供了一种集成的解决方案,旨在简化和加…

Spring+Mybatis解析

源码执行流程 通过MapperScan导入MapperScannerRegistrar类MapperScannerRegistrar类实现了ImportBeanDefinitionRegistrar接口,Spring启动会调MapperScannerRegistrar类中的registerBeanDefinitions方法在registerBeanDefinitions方法中注册一个MapperScannerConf…

Mock 数据

1. Mock 数据的方式 2. json-server 实现 Mock 数据 项目中安装json-server npm i -D json-server准备一个json文件添加启动命令 //package.json"scripts": {"start": "craco start","build": "craco build","test&q…

怎样用AIDL Service 传递复杂数据

大家都知道在Android中通过AIDL可以跨进程调用Service中的数据,网上也有很多实例,但是大部分实例都是关于基本数据类型的远程调用,很少讲到复杂数据的调用,今天我用一个例子来演示一下怎样用AIDL Service 传递复杂数据。 我们分2…

给做steam游戏搬砖项目新手小白的5个警示

CSGO搬砖日常出货更新 今天,阿阳要向你们揭秘一个备受瞩目的项目——Steam搬砖项目。或许你们已经听闻过它的名字,但今天我要带领你们深入了解这个项目的本质,为你们揭示五个必须警惕的警示。让我们共同探索这个项目是否适合你们,…

微服务保护 Sentinel

1.初识Sentinel 文章目录 1.初识Sentinel1.1.雪崩问题及解决方案1.1.1.雪崩问题1.1.2.超时处理1.1.3.仓壁模式1.1.4.断路器1.1.5.限流1.1.6.总结 1.2.服务保护技术对比1.3.Sentinel介绍和安装1.3.1.初识Sentinel1.3.2.安装Sentinel 1.4.微服务整合Sentinel 2.流量控制2.1.簇点链…

Springboot整合MybatisPlus及分页功能

1 引入pom <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot</artifactId><version>2.7.14</version> </dependency> <dependency><groupId>com.baomidou</groupId><a…

Vue框架学习笔记——Vue实例中el和data的两种写法

文章目录 前文提要Vue实例的el第一种写法第二种写法小结 Vue实例中data第一种写法&#xff0c;对象式效果图片第二种写法&#xff0c;函数式效果图片小结 前文提要 本文仅做自己的学习记录&#xff0c;如有错误&#xff0c;请多谅解 Vue实例的el 第一种写法 <body><…

劲松中西医医院HPV诊疗中心科普:扁平疣4个知识点要了解

扁平疣是一种常见的皮肤病&#xff0c;其表现为皮肤上的扁平丘疹&#xff0c;通常无痛无痒&#xff0c;但会影响患者的外貌和心理。许多人在患上扁平疣后会考虑是否可以自己消退&#xff0c;下面我们将从几个方面进行探讨。 扁平疣的病因 扁平疣是由人乳头瘤病毒(HPV)引起的。…

Go语言中结构体的使用和示例

结构体&#xff08;简称struct&#xff09;用于创建不同数据类型的成员集合&#xff0c;放入一个单一的变量中。虽然数组用于将相同数据类型的多个值存储在单一变量中&#xff0c;但结构体用于将不同数据类型的多个值存储在单一变量中。结构体对于将数据组合在一起以创建记录非…

【封装UI组件库系列】封装Icon图标组件

封装UI组件库系列第三篇封装Icon图标组件 &#x1f31f;前言 &#x1f31f;封装Icon 1.创建Icon组件 2.引用svg图标库 第一步 第二步 第三步 3.二次封装 4.封装自定义属性 &#x1f31f;总结 &#x1f31f;前言 在前端开发中&#xff0c;大家可能已经用过各种各样的UI组…

机器学习【01】相关环境的安装

学习实例 参考资料&#xff1a;联邦学习实战{杨强}https://book.douban.com/subject/35436587/ 项目地址&#xff1a;https://github.com/FederatedAI/Practicing-Federated-Learning/tree/main/chapter03_Python_image_classification 一、环境准备 GPU安装CUDA、cuDNN pytho…

(二)C语言之变量与算数运算表达式概述

C语言之变量与算数运算表达式概述 一、华氏温度与摄氏温度对照二、代码概述三、练习 一、华氏温度与摄氏温度对照 #include <stdio.h>/*当华氏温度为 0,20,40,...300时&#xff0c;打印出华氏温度与摄氏温度对照表华氏温度与摄氏温度 C(5/9)(̧F-32) 其中C表示摄氏温度&…

Jenkins Ansible 参数构建

首先在Jenkins中创建自由项目 在web端配置完成后在另一台机子上下载nginx 在gitlab端创建项目并创建文件配置代码 在有Jenkins的机器上下载Ansible [rootslave1 ~]# yum -y install epel-release [rootslave1 ~]# yum -y install ansible再进入下载nginx机器中克隆gitlab项目…

【CCF-PTA】第03届Scratch第01题 -- 梦醒时分

梦醒时分 【题目描述】 睡眠是人体正常的生理需要&#xff0c;同年龄男女睡眠时间无明显差别&#xff0c;一般是8小时左右。居家的小明作息生活很规律&#xff0c;晚上11点睡觉&#xff0c;早晨7点起床学习。请你编写程序来判断&#xff0c;每周&#xff08;共168小时&#x…

YOLO目标检测——垃圾检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;智能化垃圾分类系统、垃圾回收和处理领域的优化管理等方面数据集说明&#xff1a;垃圾分类检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;含报纸、蛋壳、矿泉水瓶、电池、拉链顶罐、塑料餐盒、纸质药盒、香蕉皮…

协同过滤与矩阵分解讲解(PPT)

总览 协同过滤算法&#xff0c;就是一种完全依赖用户和物品之间行为关系的推荐算法。 从字面理解&#xff0c;协同大家的反馈、评价和意见一起对海量的信息进行过滤&#xff0c;从中筛选出用户可能感兴趣的信息。 知识概括 从这几个方面进行分析。 一、基于用户的协同过滤 显示…

富士康转移产线和中国手机海外设厂,中国手机出口减少超5亿部

富士康和苹果转移生产线对中国手机制造造成了巨大的影响&#xff0c;除此之外&#xff0c;中国手机企业纷纷在海外设厂也在减少中国手机的出口&#xff0c;2022年中国的手机出口较高峰期减少了5.2亿部。 手机是中国的大宗出口商品&#xff0c;不过公开的数据显示2022年中国的手…