MySQL — 事务 (o゚▽゚)o

news2024/11/24 6:26:43

文本目录:

❄️一、什么是事务:

❄️二、ACID特性:

❄️三、使用事务:

        ▶1、查看支持事务的存储引擎:

        ▶2、语法:

        ▶3、开启并且回滚:

        ▶4、开启并且提交:

       ▶ 5、保存点:

        ▶6、手动/自动提交事务:

❄️四、事务的隔离性和隔离级别:

        ☑1、隔离性:

        ☑2、隔离级别:

        ☑3、查看和设置隔离级别:

        ☑4、不同隔离级别存在的问题:

               1)、READ UNCOMMITTED — 读未提交与脏读:

                2)、READ COMMITTED — 读已提交与不可重复读:

                3)、REPEATABLE READ — 可重复读与幻读:

                4)、SERIALIZABLE — 串行化:

        ☑5、不同隔离级别的性能:

❄️总结:


❄️一、什么是事务:

     事务呢就是把一组 SQL 语句打包成为一个整体,对于这组 SQL 语句的执行呢,结果要么是全部成功,要么是全部失败。对于这组 SQL 语句可以是 一条也可以是多条语句。

     我们来举一个例子:

对于转账来说:670da53457174d4e95fbcbe1be3e855e.png

 我们来看看对于这个操作的语句的编写:

6f30d2b5188e4372877f38628a7aff60.png

转账成功之后呢,要满足一下结果:

1、张三 的钱为 900 而李四的钱为1100,不能出现张三减少而李四没有增加的结果。

2、张三和李四在转账前后的总的钱数是不变的,1000+1000 = 2000 - > 900 + 1100 = 2000

3、转账后的结果应该保存在存储介质中,以便于后面的使用

4、 在转账的处理过程中张三和李四的余额不能因其他的转账事件而受到干扰。

这上面的四个条件呢,就是我们的 事务在执行过程中必须要保证的,这也就是事务的 ACID特性。

我们来详细介绍一下 ACID 特性。


❄️二、ACID特性:

         事务的 ACID 呢指的是:Atomicity(原子性),Consistency(一致性),Isolation(隔离性)和Durability(持久性)

1、Atomicity(原子性):

        一个事务中的所有操作要么全部成功、要么全部失败,不会出现只成功一半的情况,如果事务在执行过程中发生错误,会 回滚 到事务的开始前的状态,就像这个事务从来没有执行过一样。

2、Consistency(一致性):

        在事务的开始之前或者结束之后,数据库的完整性不会被破坏。这表示写入的数据必须完全符合所有的预设规则,包括数据的精度、关联性以及关于事务执行过程中服务器崩溃后如何恢复。

3、Isolation(隔离性):

         数据库允许多个并发事务同时对数据进行读写和修改,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务可以指定不同的隔离级别,以权衡在不同的应用场景下数据库性能和安全。

4、Durability(持久性):

         事务处理结束后,对数据的修改将永久的写入存储介质,即便系统故障也不会丢失。 


❄️三、使用事务:

        ▶1、查看支持事务的存储引擎:

       要使用事务那么数据库就要支持使用,在 MySQL 中呢支持事务的存储引擎呢是 InnoDB ,我们可以通过  show  engines;来进行查看:

d721b513be674986aa86d9c361cb00ad.png


        ▶2、语法:

    对于事务的语法就非常的简单了,我们来看看:

-- 开启一个新的事务

START   TRANSACTION;

-- 或者

BEGIN
 

-- 提交当前事务,并对更改持久化保存

COMMIT;

-- 回滚当前事务,取消其更改

ROLLBACK;

注意:

   不论是 提交 或者 回滚 ,事务都会关闭


        ▶3、开启并且回滚:

我们先来开启事务:

6d99f34227114346872f9923f5c79214.png

这之后我们所写的 SQL语句 都是包含在事务中的。之后我们再进行操作:

cb7a69e403c540909dbe7953c47ff542.png 这些操作都包含在 事务中,之后我们来进行回滚之后,再看看余额是什么:

220d4244342242bfb9cf112ab93af489.png

可以看到再 回滚事务之后呢 我们的数据就返回到了事务开始之前了。


        ▶4、开启并且提交:

这个操作呢,在关闭事务之前的操作是一样的,我们直接来看代码:41c8695b4b5a4defb957211fa6547700.png

我们来提交一下事务看看:dc92068285d844e7be7c5d82d35c3783.png 我们可以看到对于提交之后呢,数据就进行了在事务中执行之后所得的数据的结果进行了保存。


       ▶ 5、保存点:

语法:

SAVEPOINT  保存点的名字;

我们来看看如何使用:25957dde1d44407589144e5580f1a9a3.png

     这个虽然有点长,但是呢这个就是我们的关于保存点的使用,和如何回滚到保存点的操作。这里要注意:当我们的回滚到保存点这个操作的时候,我们要注意要有 to 和保存点的名字。


        ▶6、手动/自动提交事务:

        默认情况下,MySQL是自动提交事务的,也就是说我们执行的每个修改操作,比如插入、更新和删除,都会自动开启一个事务并在语句执行完成之后自动提交,发生异常时自动回滚。

        查看当前事务是否自动提交可以使用以下语句:

show variables like 'autocommit';

633188c57e7743948fdac169daa17e0f.png

ON 表示自动提交开启。

如果想要更改是否是否自动提交,我们可以使用一下语句:

设置自动提交:

SET AUTOCOMMIT=1;
SET AUTOCOMMIT=NO;


设置手动提交:

SET AUTOCOMMIT=0;
SET AUTOCOMMIT=OFF;

对于我们的修改是否自动提交的时候要注意:

1、只要使用 START TRANSACTION 或 BEGIN 开启事务,必须要通过 COMMIT 提交才会持久化,与是否设置 SET autocommit 无关。

2、手动提交模式下,不用显示开启事务,执行修改操作后,提交或回滚事务时直接用commit 或 rollback。

3、 已提交的事务不能回。


❄️四、事务的隔离性和隔离级别:

        ☑1、隔离性:

          简单来说呢,隔离性就是让不同的事务之间在执行的过程中不受影响,那么事务之间就需要要相互隔离。


        ☑2、隔离级别:

      事务之间不同的隔离程度,我们称之为 —— 事务的隔离级别不同的隔离级别在性能和安全方面做了取舍,有的隔离级别注重并发性,有的注重安全性,有的则是并发和安全适中。

在MySQL 中对于事务的隔离级别有四种:

a、READ  UNCOMMITTED读未提交

b、READ  COMMITTED读已提交

c、REPEATABLE  READ可重复读(默认)

d、SERIALIZABLE 串行化

但是呢对于这几种隔离级别都存在一些问题不是很完美的,这些问题我们之后来了解一下。


        ☑3、查看和设置隔离级别:

      事务的隔离级别分为全局作用域和会话作用域,查看不同作用域事务的隔离级别,可以使用以下的方式:

-- 全局作用域

SELECT @@GLOBAL.transaction_isolation;

-- 会话作用域

SELECT @@SESSION.transaction_isolation;
 

 我们来演示一遍:163eae05614f4b8bbdb41844f537f355.png

 默认是 可重复读的。


     对于在不同的作用域中设置事务的隔离级别:

语法1:

SET  [GLOBAL|SESSION]  TRANSACTION  ISOLATION  LEVEL  隔离级别;

语法2:

这里要注意在隔离级别中如果存在空格要使用 “-” 代替

SET GLOBAL transaction_isolation = '隔离级别';

语法3:

这里要注意在隔离级别中如果存在空格要使用 “-” 代替

SET @@GLOBAL.transaction_isolation = '隔离级别'

 示例:

语法1:

-- 设置全局事务隔离级别为串行化,后续所有事务生效,不影响当前事务
SET  GLOBAL  TRANSACTION  ISOLATION  LEVEL  SERIALIZABLE;


-- 设置会话事务隔离级别为串行化,当前会话后续的所有事务⽣效,不影响当前事务,可以在任何时候执行
SET  GLOBAL  TRANSACTION  ISOLATION  LEVEL  SERIALIZABLE;

语法2: 

SET GLOBAL transaction_isolation = 'SERIALIZABLE';

SET GLOBAL transaction_isolation = 'REPEATABLE-READ';


        ☑4、不同隔离级别存在的问题:

               1)、READ UNCOMMITTED — 读未提交与脏读:

            这个的隔离级别,由于不在读取数据额时候做任何的操作,那么其并发性很高,但是呢会出现大量的数据安全问题,比如“脏读”。

什么是“脏读”:

         比如在事务A中执行了一条 insert 语句,在没有执行 commit 的情况下,会被事务B读取到,这个时候我们在事务A中进行回滚,那么 事务B 中读取到的 事务A写入的数据将没有意义,我们把这个现象叫做——“脏读”。

我们来实现一下这个问题:4edb0cfc46e843559564990f853ce079.png

这个就是我们的 读未提交中的 “脏读” 问题。


                2)、READ COMMITTED — 读已提交与不可重复读:

        为了解决 “脏读” 这个问题呢,我们把事务的隔离级别设置为——READ COMMITTED,这个时候事务只能读取到其他事务提交之后的数据,但会出现——不可重复读的问题

        比如:我们在事务A中查询这个数据,之后在事务B中 修改这个数据 或者 新增一个数据,并且进行了 commit 操作,这时候 事务A 再查询数据的时候呢,得到的是事务B修改之后的结果,这个时候事务A就出现了在同一个事务中通过相同的问题,但是查询的是不同的结果,这个就是——不可重复读 问题。

 我们还是进行对这个问题重现一下:

ff1d1773a95840c49324cbdf8be587ab.png


                3)、REPEATABLE READ — 可重复读与幻读:

     为了解决上面的问题呢,又提出了 REPEATABLE READ 的隔离级别,这时同一个事务中读取的数据在任何时候都是相同的结果。但是又出现了一个问题——幻读

     比如:事务A查询了一个区间的记录得到结果集A,事务B向这个区间的间隙中写入了一条记录并提交,事务A再查询这个区间的结果集时会查到事务B新写入的记录得到结果集B,两次查询的结果集不一致,这个呢就是 —— 幻读

我们还是来看看问题的演示:

       这里因为 MySQL的InnoDB使用了 Next—Key 锁,解决了大部分的幻读问题,这里为了实现幻读,我们使用 READ COMMITTED 这个隔离级别。

7c58f79053524bac978625381a5819fa.png 这个就是幻读的问题的演示了。


                4)、SERIALIZABLE — 串行化:

       这个没有什么问题,此时所有的事务进行串行执行,可以解决所有的并发的安全问题,但是呢这个并发的性能最低。


        ☑5、不同隔离级别的性能:

并发性能隔离级别脏读不可重复读幻读隔离力度
READ  UNCOMMITTED存在存在存在
较高READ  COMMITTED解决存在存在较低
较低REPEATABLE  READ解决解决存在较高
SERIALIZABLE 解决解决解决

❄️总结:

       OK,我们的事务到这里呢也就结束了,并且对于MySQL的基础知识呢,我们到这里也同样了解完了,我们呢在下一博客中就要开启新的篇章了,让我们尽情期待吧!!!拜拜~~~

057fcc08cdc0424ea2c12d194d78667d.png

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

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

相关文章

DOS时代软件遗憾落幕,国产编程新势力接过火炬

在计算机发展史上,DOS时代是一个不可磨灭的篇章。那个时期,虽然操作系统的图形界面尚未普及,但一款款经典软件却为我们打开了通往数字世界的大门,让我们在那个相对简单却充满魅力的时代中,感受到科技的魅力与创新的力量…

Qt的信号槽机制学习一

一、Qt理论知识简记 (一)信号与槽[1] 信号与槽是Qt编程的基础,其使得处理界面上各个组件的交互操作变得比较直观和简单,GUI(Graphical User Interface)程序设计的主要工作就是对界面上各组件的信号进行相应…

P11232 [CSP-S 2024] 超速检测

P11232 [CSP-S 2024] 超速检测 难度:普及/提高。 考点:二分、贪心。 题意: 题意较长,没有题目大意,否则你也大意。 主干道长度为 L L L,有 n n n 辆车,看做左端点为 0 0 0,第 …

使用GetX实现GetPage中间件

前言 GetX 中间件(Middleware)是 GetX 框架中的一种机制,用于在页面导航时对用户进行权限控制、数据预加载、页面访问条件设置等。通过使用中间件,可以有效地控制用户的访问流程,并在适当条件下引导用户到所需页面。 这…

JAVA:常见 JSON 库的技术详解

1、简述 在现代应用开发中,JSON(JavaScript Object Notation)已成为数据交换的标准格式。Java 提供了多种方式将对象转换为 JSON 或从 JSON 转换为对象,常见的库包括 Jackson、Gson 和 org.json。本文将介绍几种常用的 JSON 处理…

视频怎么去水印?7个视频去水印在线工具大比拼,宝藏工具推荐!

您是否正在寻找一款好用的视频去水印在线工具,却总是难以找到合适的去水印软件?别担心,今天在本文中小编将和大家分享一些去水印的小助手。很多人都觉得视频或图片上的水印十分烦人。如果您有着同样的烦恼,那么使用去水印工具将是…

如何一键更换ppt模板?掌握这2个ppt技巧快速搞定!

每当要制作ppt,很多人会第一时间去搜刮各种ppt模板,有时我们找到了一份貌似符合需求的模板,等到了ppt制作环节,才发现离我们的预期相距甚远,做到一半的ppt如何换模板呢? 想要在中途更换ppt模板,…

0基础入门linux文件系统

目录 文件系统简介 1. 文件系统类型 2. 文件系统结构 3. 文件系统的主要功能 4. 文件系统的使用 5. 文件系统的维护 6. 注意事项 简单举例 机械硬盘 物理结构介绍​编辑 CHS寻址 逻辑结构介绍 LBA寻址法 文件系统与磁盘管理 Boot Block Data block inode block…

2024年meme币走势分析:最后两个月的市场趋势与机会 #交易所#dapp#KOL社区合作

2024年即将步入尾声,meme币市场经历了显著的波动。对于加密市场来说,年底的走势尤为关键,尤其是meme币这种受市场情绪影响较大的加密资产。本文将从市场环境、宏观经济因素、投资者情绪、技术分析等方面分析meme币在2024年最后两个月的潜在走…

Cpp多态机制的深入理解(20)

文章目录 前言一、多态的概念二、多态的定义与实现两个必要条件虚函数虚函数的重写重写的三个例外override 和 final重载、重写(覆盖)、重定义(隐藏) 三、抽象类概念接口继承和实现继承 四、多态的原理虚表和虚表指针虚函数调用过程动态绑定与静态绑定 五、那...那单继承甚至多…

.net core 接口,动态接收各类型请求的参数

[HttpPost] public async Task<IActionResult> testpost([FromForm] object info) { //Postman工具测试结果&#xff1a; //FromBody,Postman的body只有rawjson时才进的来 //参数为空时&#xff0c;Body(form-data、x-www-form-urlencoded)解析到的数据也有所…

高清解压视频素材从哪儿下载?推荐5个高清推文素材资源网站

做抖音小说推文&#xff0c;哪里找爆款素材&#xff1f;作为一名从业多年的视频剪辑师&#xff0c;今天就来给大家揭秘可以下载爆款推文视频素材的网站&#xff0c;如果你也在苦苦找寻找&#xff0c;赶紧进来看看吧&#xff5e; 1. 稻虎网 首先是稻虎网&#xff0c;作为国内顶…

Python的全局锁GIL解析

Python的全局锁&#xff08;GIL&#xff09;是 CPython 解释器实现中的一个机制&#xff0c;用来确保任何时候只有一个线程执行 Python 字节码。这一机制存在于 CPython 中&#xff0c;主要是为了确保线程操作中的数据一致性&#xff0c;但也因此限制了多线程的并行执行效率。尤…

ELK的ElasticStack概念

目录 传送门前言一、ElasticStack是什么二、ElasticStack数据格式1、Elasticsearch的概述2、Elasticsearch核心概念&#xff08;1&#xff09;接近实时&#xff08;NRT&#xff09;&#xff08;2&#xff09;集群&#xff08;cluster&#xff09;&#xff08;3&#xff09;节点…

硅谷甄选(9)SKU模块

SKU模块 8.1 SKU静态 <template><el-card><el-table border style"margin: 10px 0px"><el-table-column type"index" label"序号" width"80px"></el-table-column><el-table-columnlabel"名称…

如何将ppt转换成word文档?8款ppt转word免费的软件大揭秘,值得收藏!

在日常办公中&#xff0c;将ppt转换成word文档的需求日益增长。这种需求源自多个方面&#xff0c;比如制作详尽的报告、创建课程讲义&#xff0c;或者将信息转化为可编辑的格式。作为一种普遍使用的演示工具&#xff0c;ppt在许多商业环境中扮演着重要角色。然而&#xff0c;随…

pandas——DataFrame

一、dataframe &#xff08;一&#xff09;创建dataframe file.csv Name,Age,City Alice,30,New York Bob,25,Los Angeles Charlie,35,Chicagoimport pandas as pd 1.使用字典创建DataFrame&#xff1a; 其中字典的键是列名&#xff0c;值是数据列表。print(1.使用字典创建D…

vxe-table v4.8+ 与 v3.10+ 虚拟滚动支持动态行高,虚拟渲染更快了

Vxe UI vue vxe-table v4.8 与 v3.10 解决了老版本虚拟滚动不支持动态行高的问题&#xff0c;重构了虚拟渲染&#xff0c;渲染性能大幅提升了&#xff0c;行高自适应和列宽拖动都支持&#xff0c;大幅降低虚拟渲染过程中的滚动白屏&#xff0c;大量数据列表滚动更加流畅。 自适…

关于武汉芯景科技有限公司的马达驱动芯片AT6237开发指南(兼容DRV8837)

一、芯片引脚介绍 1.芯片引脚 二、系统结构图 三、功能描述 逻辑功能

青出于“蓝”的合资第一新能源,“换壳”背后有门道

文/王俣祺 导语&#xff1a;千呼万唤始出来的新能源“马6”终于亮相了&#xff0c;这款马自达EZ-6本以为凭借马自达多年来在国内市场深耕的底蕴可以收获一片支持&#xff0c;但最近却深陷“换壳”风波。那么今天我们就一起看看&#xff0c;这款马自达EZ-6和被冠以“原型”的深蓝…