【MySQL】如何理解事务

一、引出事务

假设我们有一张用户表,如图所示:

91659bf3510f41b79b59458cb332161b.png

我们现在的需求是:小红向小明转账100块

那么我们可以执行如下指令:

update user set salary = salary-100 where id=1;//第一条语句小红转一百
update user set salary = salary+100 where id=2;//第二条语句小明收一百

但是如果我们执行第一条语句结束,执行第二条语句的时候失败,那么就会造成小红的salary=400,而小明的salary=100,当资金数额巨大,这样就会造成重大事故,原因就是我们的第一条和第二条语句不是一起执行,不是一个原子操作(要么全做,要么全不做)。那么我们的事务就可以解决这类问题。

二、事务

1、概念

事务用于保证数据饿一致性,它由一组相关的DML(插入、修改、删除)语句构成 ,该组的DML语句要么全部成功,要么全部失败。

2、事务与锁

当执行事务操作时(DML语句),MySQL会在表上加锁,防止其它用户改变表的数据,这对用户来说很重要。

3、事务基本语句和操作流程

事务中的基本操作

①start transaction : 开启一个事务;

②savepoint 保存点名称  :设置保存点;

③rollback to 保存点名称 :回退事务;

④rollback : 回退全部事务;

⑤commit : 提交事务,所有的操作生效,不能回滚。

事务基本操作流程

df4253a0959549278a7d41fe28ada10c.png

如上图所示,我们在A点开启了事务,设置了保存点B、C,分别执行了三个DML操作,当前程序处在D点。假设我们觉得第三个执行的DML操作有问题,那么我们这时可以通过rollback to到保存点C重新执行我们的程序,此时数据库中保存的数据就是C之前的数据,当然也可以回滚到A点或者回到开启事务的地方(注:此时在这之前的保存点的消息全都被删除了)。

案例展示:

先执行如下操作:

#1、创建一张表
create table t
(id int ,
`name` VARCHAR(45)
);select * from t;#2、开始事务start TRANSACTION#3、设置保存点aSAVEPOINT a;#4、执行dml操作INSERT into t VALUES("1","张三");#设置保存点bSAVEPOINT b;#执行dml操作INSERT into t VALUES("2","李四");

此时数据库中数据:

83139a827d854a9f97d7ecec9bd2844c.png

再执行以下指令:

 #退回到bROLLBACK to b;#退回到aROLLBACK to a;#回退全部事务,直接回退到事务开始的状态ROLLBACK#提交事务COMMIT

分别得到回退到b:

982da087fe4241648776f797a7864483.png

回退到a:

18ac4a0ed0f54b42a51efc8ecc1189c3.png

全部事务回退:

26a9daa49cc143a8a0cd337a1e8c3924.png

事务提交后:

若想回退到b

d951eca0a79a42a6b7e53decb29b6082.png

4、事务的细节

①:如果不开启事务,在默认情况下,DML操作是自动提交的。不能回滚的;

②:如果开启一个事务。你没有创建保存点。你可以执行rollback,默认返回到开启事务的状态;

③:在事务还未提交时,可以设置多个保存点;

④:MySQL的事务机制需要innodb的存储引擎才可以使用,MyISAM存储引擎不好使用;

⑤:开启事务start transaction,关闭事务set autocommit=off.

三、事务的隔离级别

1、概念

多个连接开启各自的事务操作数据库中的数据时,数据库系统要负责隔离 操作,以保证各个连接在获取数据时的准确性。

bae9727cc45a43d089ef16c7e327fab9.png

假如有两个客户端Client1与Client2同时对我们数据库的user表进行操作,假设Client1对user表执行DML操作,而Client2在对user表执行查看操作,此时设置不同的隔离级别,Client2便会看到不同的数据。

2、不考虑隔离级别,可能出现情况

(1)脏读

  事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据。(读取到别人未提交的数据)

(2)不可重复读

事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交(主要是修改或删除),导致事务A多次读取同一数据时,结果不一致。

b4d58facf4a946418793244a386ff731.png

如图所示,假设事务A在8:00开始读取数据,读取8:00之前的数据,此时,8:01时事务B登录了数据库并对数据库执行了DML操作,而此时A却看到了B中对数据的操作,此时出现了不可重复读,因为A还未Commit提交结束的话,是不应该看到B的操作的。

(3)幻读

系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录(主要是插入操作),当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

3、事务隔离级别

①未提交读: 最低的隔离级别,允许读取尚未提交的数据变更,可 能会导致脏读、幻读或不可重复读。

②已提交读: 允许读取并发事务已经提交的数据,可以阻止脏读,但是 幻读或不可重复读仍有可能发生。

③可重复读: 对同一字段的多次读取结果都是一致的,除非数据是被本身 事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。

④可串行化: 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐 个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读 以及幻读

使用隔离级别之前一定要开启事务!!! 

说明:√表示可能出现,×表示不可能

事务隔离级别脏读不可重复读幻读加锁读
读未提交(read-uncommitted)不加锁
读提交(read-committed)×不加锁
可重复读(repeatable-read)×××不加锁
串行化(serializable)×××加锁

四、MySQL事务的ACID

①原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操 作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。

②一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。

③隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能 向这张卡转账。

④持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

五、总结

    到了最后做一个总结吧,这篇文章应该是把事务的大多数知识点做了一个总结,对于一些面试题的知识点也是涉及到了的,而且对于一些比较难理解的地方。博主也是举例和图表相结合的形式进行阐述,如果觉得对屏幕前小伙伴有所帮助,不要忘点赞+关注一波哦!后期还会有更多的内容的饿呈现!

 

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

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

相关文章

学习使用在mysql中查询指定字段字符串包含多个字符串的方法

学习使用在mysql中查询指定字段字符串包含多个字符串的方法 使用LIKE关键字使用REGEXP关键字使用FIND_IN_SET函数使用INSTR函数和AND关键字 使用LIKE关键字 SELECT * FROM table_name WHERE column_name LIKE %string1% AND column_name LIKE %string2%;使用LIKE关键字&#x…

RabbitMQ(一):消息队列MQ

目录 1 消息队列MQ1.1 MQ简介1、什么是MQ2、MQ的优势流量削峰应用解耦异常处理数据分发分布式事务 3、消息中间件的弊端4、常用的MQ 1.2 MQ中几个基本概念1.3 MQ的通信模式1.4 消息的发布策略1.5 常用消息中间件协议1、AMQP协议2、MQTT协议3、OpenMessage协议4、kafaka协议 1 消…

TiDB 社区智慧合集丨TiDB 相关 SQL 脚本大全

非常感谢各位 TiDBer 在之前 【TiDBer 唠嗑茶话会 48】非正式 TiDB 相关 SQL 脚本征集大赛!( https://asktug.com/t/topic/996635 )里提供的各种常用脚本。 在这篇文章中,我们整理了社区同学提供的一系列 TiDB 相关 SQL 脚本,希望能为大家在…

APP被针对攻击了,要怎么解决

随着APP行业的兴起,游戏公司异军突起,不管是在控证还是攻击方面都是属于最复杂的一个场面,游戏APP逐渐成为DDOS流量攻击的“重灾区”。没有提前做好了解就盲目进军游戏APP行业,一旦被攻击就会让公司束手无策。那么,刚上…

OpenAI视频生成模型Sora的全面解析:从ViViT、Diffusion Transformer到NaViT、VideoPoet

前言 真没想到,距离视频生成上一轮的集中爆发(详见《Sora之前的视频生成发展史:从Gen2、Emu Video到PixelDance、SVD、Pika 1.0》)才过去三个月,没想OpenAI一出手,该领域又直接变天了 自打2.16日OpenAI发布sora以来(其开发团队包…

ubuntu20.04 安装 matlab R2023b

ubuntu20.04 使用matlab R2023b 起因步骤问题问题1问题2问题3 起因 闲着没事,想在ubuntu上安装matlab。 步骤 这个博客写得很好,我就不赘述了:参考博客 。但有点不一样:我现在matlab官网上下载的linux版本不是iso镜像文件&…

Redis实现滑动窗口限流

常见限流算法 固定窗口算法 在固定的时间窗口下进行计数,达到阈值就拒绝请求。固定窗口如果在窗口开始就打满阈值,窗口后半部分进入的请求都会拒绝。 滑动窗口算法 在固定窗口的基础上,窗口会随着时间向前推移,可以在时间内平滑控…

基于yolov5的苹果检测(pytorch框架)【python源码+UI界面+功能源码详解】

功能演示: 基于yolov5的苹果检测系统,系统既能够实现图像检测,也可以进行视屏和摄像实时检测_哔哩哔哩_bilibili (一)简介 基于yolov5的苹果检测系统是在pytorch框架下实现的,这是一个完整的项目&#xf…

H12-821_45

45.如图所示,同一局域网中的四台路由器运行IS-IS,其中R1是DIS.则R2、R3、R4分别和R1建立邻接关系,R2、R3、R4之间不建立邻接关系。 A.正确 B.错误 答案:B 注释: 在广播链路上IS-IS路由器建立邻接关系和OSPF不同,所有IS-IS路由器之间都可以建…

【Web前端笔记11】JavaScript基础与变量

前言 11 JavaScript基础与变量 一、Js简介 1、JavaScript核心部分: 2、有非常广泛的使用领域 3、JavaScript与ECMAScript的关系 4、JavaScript版本 二、JavaScript名词解释 三、变量命名规则 四、变量类型 六大基本数据类型: 1、数字类型 2、…

C语言-指针初学速成

1.指针是什么 C语言指针是一种特殊的变量,用于存储内存地址。它可以指向其他变量或者其他数据结构,通过指针可以直接访问或修改存储在指定地址的值。指针可以帮助我们在程序中动态地分配和释放内存,以及进行复杂的数据操作。在C语言中&#…

RabbitMQ-消息队列:发布确认高级

18、发布确认高级 在生产环境中由于一些不明原因,导致 RabbitMQ 重启,在 RabbitMQ 重启期间生产者消息投递失败, 导致消息丢失,需要手动处理和恢复。于是,我们开始思考,如何才能进行 RabbitMQ 的消息可靠投…

ARM服务器部署Kafka集群

安装前必备的条件是: (1)安装jdk(提供环境); (2)安装zookeeper(注册kafka信息); 需要这方面信息的可以查看我之前写的文档; 一.下载安装包 Kafka官网下载地址 Apache Kafka 根据自己需要下载相应的版本 目前最新的版本是3.6.1。 二.解压安装包 服务器上传下载好的kafk…

《Linux C编程实战》笔记:信号量

信号量在操作系统的书里一般都有介绍,这里就只写书上说的了。 信号量是一个计数器,常用于处理进程或线程的同步问题,特别是对临界资源访问的同步。临界资源可以简单地理解为在某一时刻只能由一个进程或线程进行操作的资源,这里的…

【零基础入门】什么样的人适合学网络安全?该怎么学?

有很多想要转行网络安全或者选择网络安全专业的人在进行决定之前一定会有的问题: 什么样的人适合学习网络安全?我适不适合学习网络安全? 到底什么样的人适合学习网络安全呢?(需要什么前提条件呢) 开门见山…

【Appium UI自动化】pytest运行常见错误解决办法

通过Appium工具录制代码在pycharm上运行报错: 错误一: 1.提示 setup() 方法运行 error failed 解决办法:未创建 init __ 方法,创建一个空的__init.py文件就解决了。 原因: 错误二: 2.运行代码&#xff…

Linux之ACL权限管理

文章目录 1.ACL权限介绍二、操作步骤1. 添加测试目录、用户、组,并将用户添加到组2. 修改目录的所有者和所属组3. 设定权限4. 为临时用户分配权限5. 验证acl权限6. 控制组的acl权限 1.ACL权限介绍 每个项目成员有一个自己的项目目录,对自己的目录有完全…

构建生物医学知识图谱from zero to hero (4):通过Neo4j构建知识图谱

图数据库是一种专门用于存储图形数据的 NoSQL 数据库。与传统的关系型数据库和其他 NoSQL 数据库不同,图数据库利用图形数据模型来存储和管理数据。图形数据模型由节点和边组成,节点代表实体,边代表实体之间的关系。例如,在社交网络中,用户可以表示为节点,朋友关系可以表…

xff注入 [CISCN2019 华东南赛区]Web111

打开题目 看见smarty 想到模板注入 又看见ip 想到xff注入 一般情况下输入{$smarty.version}就可以看到返回的smarty的版本号。该题目的Smarty版本是3.1.30 在Smarty3的官方手册里有以下描述: Smarty已经废弃{php}标签,强烈建议不要使用。在Smarty 3.1&#xff…

C# OpenVINO 百度PaddleSeg实时人像抠图PP-MattingV2

目录 效果 项目 代码 下载 C# OpenVINO 百度PaddleSeg实时人像抠图PP-MattingV2 效果 项目 代码 using OpenCvSharp; using Sdcb.OpenVINO; using System; using System.Diagnostics; using System.Drawing; using System.Security.Cryptography; using System.Text; us…