MySQL数据库的事务

news2024/11/29 4:48:19

在这里插入图片描述

文章目录

  • 一、事务是什么?
  • 二、事务的四大特征
    • 原子性
    • 一致性
    • 持久性
    • 隔离性
    • MySQL的四个隔离级别

一、事务是什么?

数据库的事务是一种机制,一个操作序列,里面包含了一组数组库操作命令
事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数组库命令要么同时成功,要么同时失败
事务是一个不可分割的工作逻辑单元
在这里插入图片描述
比如小张向小王借500块钱,这个一系列操作就可以当作一个事务,我们可以分为两个操作,1是小张的账户 -500,2是小王的账户+500,但是如果要是我们的数据库出现异常了,小张的账户-500了,但是小王的账户没有+500,那么这个操作就十分危险了。那么这个时候事务的作用就体现出来了。
在这里插入图片描述
这里我们就可以防止错误的发生了,当出现异常时,我们就可以回滚事务。
开启事务:

-- 开启事务
START TRANSACTION;
--或者
BEGIN;

提交事务:

-- 提交事务
COMMIT;

回滚事务:

ROLLBACK;

我们创建一个账户表

CREATE TABLE account(
   id int primary key auto_increment,
	 name varchar(50),
	 money double(10,2)
);
-- 初始小张和小王账户信息
INSERT into account(name,money) values('小张',1000),('小王',1000);

在这里插入图片描述

转账操作

-- 1. 小张金额 -500
UPDATE account set money = money - 500 where name = '小张';

-- 2. 小王金额 +500
UPDATE account set money = money + 500 where name = '小张';

在这里插入图片描述
我们可以发现这是正常情况下,符合我们预期,但是我们的程序要是出现了异常情况。
在这里插入图片描述

我们举一个很简单的异常情况,我们想写注解但是没加-- 程序发生了异常。
在这里插入图片描述
我们发现了小张的账户 -了500 ,但是小王并没有+500,这种事要是发生在银行就是重大失误。
这时候我们就可以发挥事务的作用了。
在这里插入图片描述
我们发现在当前的用户查询可以发现账户发生了变化,但是我们开启了事务之后在commit之前只是临时的操作。
在这里插入图片描述
我们切换了个用户去查询发现并未改变。
但我们发现发生异常之后,我们需要恢复到事务之前的状态,这时我们需要进行回滚操作。
在这里插入图片描述
在这里插入图片描述
我们再去当前用户查看账户信息,发现账户回到了开始的状态。

START TRANSACTION;
-- 1. 小张金额 -500
UPDATE account set money = money - 500 where name = '小张';
-- 2. 小王金额 +500
UPDATE account set money = money + 500 where name = '小王';
-- 提交事务
commit;

当我们执行完事务之后发现是预期的效果,那么我们就可以提交事务,当我们提交完事务之后,数据就真真实实的在硬盘上改变了。
在这里插入图片描述
这是我们在其他用户去查询发现真真实实的改变了,上面我们基本的感受了一下事务的用法和作用。
有了这个我们是否就不担心删库删表了呢?
我们回滚ROLLBACK的操作,实际是我们把事务之前的操作逆着回去,前面插入,我们删除等,数据库会把事务执行的操作记录下来。
这些操作是有很大开销的,可以保存,但不能够无限保存。当我们回滚时,数据库要是右几十亿条数据,占据了几百G硬盘空间,你不可能花费空间将其全部记录下来。

二、事务的四大特征

原子性

原子性(Atomicity): 事务是不可分割的最小操作单元,要么同时成功,要么同时失败

事务的原子性,也是事务的核心特性,也是事务存在的必要。

一致性

一致性(Consistency): 事务完成时,必须所有的事务都保持一致状态

一致性证明我们事务前后的数据都是合法合理的,比如小张和小王事务前账户总额是2000,事务后账户总额也得是2000,事务后账户总额不能是1500,也不能是2500.

持久性

持久性(Durability): 事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

事务在执行的时候,会把执行的过程记录在硬盘上,即使我们执行到一半电脑关机了,等到下次开机后,也会根据上次的记录进行回滚到初始状态,因为关机也算是事务的一种异常情况。

那我们很容易可以想到,我们日常写sql时,都会写入到硬盘,那这是否和事务有关系呢?

我们日常书写的sql相当于是事务,而且MySQL的事务是默认提交的。

-- 查看事务的默认提交方法
select @@autocommit;
-- 1. 自动提交 0. 手动提交

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QDsowpVI-1669596945986)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20221127175900722.png)]

这些我们就可以理解为啥我们sql都是直接写入硬盘的了。当我们不想直接写入硬盘时,而是手动提交时,我们可以自己修改事务的提交方法。

-- 修改事务的提交方式为手动
set @@autocommit = 0;

隔离性

隔离性(Isolation): 多个事务之间,操作的可见性

说简单点,就是一个数据库服务器,可能同时执行多个事务时,事务之间的影响程度

如果隔离性越高,就意味着事物之间的并发程度越低,执行效率越慢,但是数据准确性越高。

如果隔离性越低,就意味着事物之间的并发程度越高,执行效率越快,但是数据准确性越低。

在这里我们无法说该怎么选择,只能说根据具体的实际情况去选择隔离性的高低,有的情况下需要高的准确性(银行,高科技),有些东西追求快(游戏,延迟低一点,血量5000的话有个10几的误差大差不差的)。

脏读

有一天,我正在宿舍写作业,我舍友看到了我前四个选择题是ABCD,这时候我在写作业是事务A,舍友看我的作业是事务B,读写都是针对同一份数据,当他走了时候,我发现自己写错了,改成了DCBA。

这种舍友看到我错误答案的情况,就是脏读问题,“读脏数据(dirty data)”,想要解决这种脏读情况,就是提高隔离性,降低并发,给"写操作加锁".

不可重复读

当我加了写加锁时(具体就是我写的时候,舍友不能看,等我写完了之后再给他看),当我给舍友把在线文档发过去的时候,舍友正在读的时候,我又觉得有一个题有问题去修改了一下在线文档,导致舍友正在看的时候在线文档突然变了,这个问题就是不可重复读,简单地说就是一个事务,两次去读同一个事务,结果不一样。

我们想解决这个问题,那么就是当舍友在读的时候,我不能再修改了。事务A与事务B的隔离性又提高了,速度变慢了(因为我得等舍友读完了才能去改),准确性提高。

幻读

这时候读写锁和写加锁都约定了,虽然我不能去改那个在线文档,但是我还可以在发送一个在线文档,或者撤回发的那个在线文档,虽然舍友读的哪一个在线文档没有变化,但总在线文档数变化了,这个问题称为幻读问题,同一个事务中,两次读到的结果集合不一样。

解决幻读的问题,严格串行化,彻底舍弃并发。

MySQL的四个隔离级别

1.read uncommited

不做任何限制,支持多事务之间的并发。并发程度最高,隔离性最差。 会产生脏读 + 不可重复读 + 幻读

2.read commited

写加锁,隔离性提高,并发程度降低。 解决了脏读问题, 仍然存在不可重复读 + 幻读问题

3.repeatable read

写加锁,读加锁,隔离性再次提高,并发程度再次降低。 解决了脏读 + 不可重复读问题 , 仍然存在幻读问题。

这个隔离级别也是MySQL的默认隔离级别,如果没有特殊的业务需要,不建议去修改这个隔离级别。如果需要改的话,通过MySQL的配置文件来进行调整。

4.serializable

严格执行串行化,并发降到最低。 解决了 脏读 + 不可重复读 + 幻读问题。

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

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

相关文章

世界杯直播背后的服务器(云计算体系)

世界杯直播背后的服务器 世界杯直播过程中,各大网络平台流媒体app上最大的变化毫无疑问就是零延迟。以前球迷看球是都会发现,网络直播的球赛会比电视播出的球赛延迟40s左右。如果群里有个看电视的兄弟兄弟每个进球他都能提前40秒预告给你,那么…

MySQL 索引

目录 一、索引的概念 二、索引的作用 三、索引的缺点 四、创建索引的原则依据 五、索引的分类和创建 1、普通索引 2、唯一索引 3、主键索引 4、组合索引(单列索引与多列索引) 5、全文索引(FULLTEXT) 六、查看索引 七、…

SpringBoot SpringBoot 原理篇 1 自动配置 1.18 自动配置原理

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇1 自动配置1.18 自动配置原理1.18.1 变更自动配置1.18.2 小结1.18.3 总结1 自…

校园网站毕业设计,校园网站设计与实现,校园网站论文作品参考

功能清单 【后台管理员功能】 关于我们设置:设置学校简介、联系我们、加入我们、法律声明、学校详情 广告管理:设置小程序首页轮播图广告和链接 留言列表:所有用户留言信息列表,支持删除 会员列表:查看所有注册会员信…

飞桨模型部署至docker并使用FastAPI调用(五)-WordPress展示页面

文章首发及后续更新:https://mwhls.top/4092.html,无图/无目录/格式错误/更多相关请至首发页查看。 新的更新内容请到mwhls.top查看。 欢迎提出任何疑问及批评,非常感谢! 飞桨模型部署至docker并使用FastAPI调用目录框架搭建 测试…

关于图的学习

一、图的定义 图G由顶点集V和边集E组成,记为G (V, E),其中V(G)表示图G中顶点的有限非空集;E(G)表示图G中顶点之间的关系(边)集合。若V { v1,v2,...,vn },则用 | V | 表示图G中顶点…

PyQt5可视化编程-布局管理

在一个GUI程序里,布局是一个很重要的方面。布局就是如何管理应用中的元素和窗口。有两种方式可以搞定:绝对定位和PyQt5的layout类 1.绝对定位: 每个程序都是以像素为单位区分元素的位置,衡量元素的大小。所以我们完全可以使用绝对定位搞定每个…

【Linux】网络编程基础

文章目录网络基础1.网络与操作系统的关系2.计算机网络发展3.协议3.1协议分层3.2OS七层模型3.3TCP/IP五层模型4.网络传输基本流程4.1数据包的封装和分用4.1.1报头和有效载荷4.2局域网的两台主机通信4.3跨网络的两台主机通信5.IP地址和MAC地址5.1IP地址5.2MAC地址5.3IP地址和MAC地…

XSCTF联合招新【真是阳间题】(MSIC+Crypto)

文章目录XSCTF联合招新【真是阳间题】(MSICCrypto)Step1:查看文件step2:操作流程关于Base64,Base32,Base16进制的区别方法:Base64:Base32:Base16:XSCTF联合招新【真是阳间题】(MSICC…

控制瑞芯微平台GPIO(输入、输出、电平读取)

控制瑞芯微平台GPIO(输入、输出)GPIO编号计算控制步骤输出高电平读取电平GPIO编号计算 GPIO编号 BANK * 32 GPIO_PIN GPION_MP N * 32 8 * (M -1) P 示例:GPIO7_C2 7 X 32 8 X (3-1) 2 242 GPIO2_A1 2 X 32 8 X (1-1) 1 73 A对…

IO流~File

File File类概述和构造方法 File:它是文件和目录路径名的抽象表示 文件和目录是可以通过File封装成对象的对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已。它可以是存在的,也可以是不存在的。将来是要通…

【PyTorch深度强化学习】DDPG算法的讲解及实战(超详细 附源码)

需要源码请点赞关注收藏后评论区留言留下QQ~~~ 一、DDPG背景及简介 在动作离散的强化学习任务中,通常可以遍历所有的动作来计算动作值函数q(s,a)q(s,a),从而得到最优动作值函数q∗(s,a)q∗(s,a) 。但在大规模连续动作空间中,遍历所有动作是不…

Css3 2D转换 2D转换之移动tranlate

转换(transform)是css3中具有颠覆性的特征之一,可以实现元素的位移、旋转、缩放等效果。 转换你可以简单理解为变形。 移动:translate旋转:rotate缩放:scale 2D转换是改变标签在二维平面上的位置和形状的…

Spring - InstantiationAwareBeanPostProcessor 扩展接口

文章目录Preorg.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorInstantiationAwareBeanPostProcessor 注册过程源码分析postProcessBeforeInstantiation的执行时机源码解析使用场景 : 创建代理类Pre Spring Boot - 扩展接口一览 org.s…

AWS Academy LMS 考勤 - 教师

AWS Academy LMS 考勤 - 教师 在 AWS Academy LMS 教材使用 - 教师 说明了如何使用 AWS Academy LMS 中所提供的线上素材,而开始上课后,教师必须要去了解学生对于教材的实际使用状况,在这里介绍如何查看学生在各模块知…

Jsoup爬虫入门实战

一、Jsoup介绍 jsoup 是一款基于 Java 的HTML解析器,它提供了一套非常省力的API,不但能直接解析某个URL地址、HTML文本内容,而且还能通过类似于DOM、CSS或者jQuery的方法来操作数据,所以 jsoup 也可以被当做爬虫工具使用。 相关…

进程通信(2) ----- 信号

文章目录一、实验目的二、实验内容三、实验要求四、实验步骤及操作五、程序源码1. 信号发送 fkill.c2. 信号监控 mysignal.c一、实验目的 1.了解进程通信间的信号机制 2.掌握进程通信间的信号编程模型 二、实验内容 信号是通信量最小的一种进程间通信形式,也用于…

【Gradle】三、深入了解Gradle

这里写目录标题一、 Gradle项目的生命周期Initialization 阶段Configuration 阶段:Execution 阶段:二、settings.gradle 文件三、Task1、 案例四、Dependencies1、依赖的分类2、依赖的下载3、依赖的类型4、api与implementation的区别5、依赖冲突及解决方…

(二) Docker安装

Docker安装一、前提二、安装三、设置阿里云镜像加速四、分析Run底层原理五、Docker会比VM虚拟机快的原因一、前提 CentOS 仅发行版本中的内核支持 Docker。Docker 运行在CentOS 7 (64-bit)上, 要求系统为64位、Linux系统内核版本为 3.8以上,这里选用Cen…

plot3D | 三维数据绘图(1):散点图、栅格图、透视图

专注系列化、高质量的R语言教程推文索引 | 联系小编 | 付费合集plot3D可以视作基础包graphcis的拓展包,用于多维数据的图形绘制。基础绘图系统里好像只有一个persp()函数与三维绘图有关,关于该函数的介绍见如下推文:基础绘图系统(…