【MySQL事务】保证数据完整性的利器

1、事务的认识

事务:事务就是将多个SQL给打包在一起,组成一个整体。组成这个整体的各个SQL,要么全部成功,要么全部失败。

举例说明:

情人节到了,滑稽老铁打算给他女朋友小美发给红包,但是他又害怕小美不收,于是他想到了一个办法就是通过银行卡进行转账。他给小美转账了 520 元,那么滑稽老铁的银行卡余额就得 -520 元,小美的银行卡余额 +520 元。这些操作就组成一个整体,就变成了事务,要么执行,要么就一个都不执行。

如果中间出错了,就一条都不执行。这里的一条都不执行,并不是真的一条都不执行,而是自动的恢复成执行之前的样子了,看起来就好像一个都没有执行一样,这个操作就称为“回滚(rollback)”。

回滚:回滚就是把执行过的操作逆向恢复回去,就像电脑上的 ctrl + z 操作

数据库会把执行的每个操作都记录下来,如果某个操作出错了,就会把事务中前面的操作进行回滚,然后根据之前进行的操作,进行逆操作

这些操作是会有很大开销的,可以保存但不能无限保存,最多就是把正在执行的事务保存下来,额外的东西不好再保存了

2、事务的特性

2.1事务的四大特性

  • 原子性:打包成整体这个操作,就称为“原子性”,这个是事务最核心的特性

举例说明:滑稽老铁给小美转账 520 元,此时滑稽老铁余额 - 520 元,小美余额 +520,此时把转账、滑稽老铁余额 - 520 元,小美余额 +520元 打包成一个整体,要么都执行,要么一个都不执行,这就具有了原子性。

  • 一致性:事务执行前/执行后,都得是数据合法的状态

举例说明:滑稽老铁给小美转账520元,如果转账成功滑稽老铁余额-520元,小美余额+520元。如果转账失败滑稽老铁余额不扣钱,小美余额也不加钱。

注:一致性是根据原子性而来的,要么全部执行,要么都不执行

  • 持久性:事务产生的修改,都会写入硬盘

举例说明:滑稽老铁给小美转账 520 元,转账成功滑稽老铁余额-520元,小美余额+520元,这个是持久的,不会改变的。

  • 隔离性:一个数据库服务器,同时执行多个事务的时候,事务之间的“相互影响程度”

举例说明:当多个事务同时执行的时候,一个事务的执行是否会干扰到其他事务,这就是事务的隔离性

2.2 隔离性的重点说明

MySQL 服务器,是要同时给多个客户端提供服务,此时多个客户端之间就可能会同时发生事务,尤其是这多个事务在操作同一个数据库的同一个表的时候,就可能引起一些麻烦

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

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

2.3 事务同时执行会出现的问题

2.3.1 脏读

脏读:当事务A在写数据的时候,事务B读取事务A写的数据,事务B 读完后,事务A改了数据,那么此刻事务B读到的数据就是错误的数据,这就称为“脏读”问题。

举例说明:张三和李四是同桌,有一次老师布置课堂作业的时候,李四第二题不会写,于是李四就偷偷的看了一眼张三写的,看到张三第二题选了A,

在这个场景下,滑稽老铁和小美这两个事务是完全并发的没有任何限制,在这个前提下就会出现脏读问题

问题:如何解决脏读问题?

答:解决脏读问题就是降低并发性、提高隔离性,可以给这里的 "写操作" 进行加锁

加锁:当进行了写加锁,滑稽老铁在制定表白计划表的期间,别人就不能同时去读了。相当于降低了并发程度,提高了隔离性,降低了一定的效率,但是提高了准备性

2.3.1 脏读

脏读:当事务A在写数据的时候,事务B读取事务A写的数据,事务B 读完后,事务A改了数据,那么此刻事务B读到的数据就是错误的数据,这就称为“脏读”问题。

举例说明:张三在写作业,作业内容 123+32 = 15.. 当张三写完 15 之后,李四跑过来瞄了一眼张三的答案:123+32=15,于是李四就把这个答案抄到自己的作业本上了,但是实际上张三要写的是 123+32 = 155,但是李四读到了一个张三还没写完的答案,也就导致李四读到了一个错误的数据,这就是脏读问题

如何解决脏读问题呢?

答:降低并发性、提高隔离性,也就是给“写操作”加锁

加锁可以分为:写加锁和读加锁

写加锁:写的时候,别人不能进行读

读加锁:读的时候,别人不能进行写

2.3.2 不可重复读

不可重复读:事务B 在读的时候,事务A改了数据,此刻事务B连续两次读到的数据结果不一样

举例说明:张三在写作业的时候,发生李四一直在瞄。张三感觉李四有点影响到他了,于是就跟李四约定,等张三写完了再给李四瞄。过了一会张三写完了,李四就开始瞄了,当李四正在瞄的时候,张三发现自己有个地方错了,就李四等一会再瞄,自己先改一下,这就导致李四之前瞄到的数据和现在瞄到的数据可能不一样

如何解决不可重复读呢?

答:给读加锁,让李四读的时候,张三不能修改。

这两个事务之间的并发程度进一步降低了,隔离性又进一步提高了,运算速度又进一步变慢了,数据的准确性又进一步提高了

2.3.3 幻读

幻读:事务A写的时候,事务B不能读;事务B读的时候,事务A不能写。虽然事务A不能写,但是事务A可以新增和删除一个其他的文件,此刻事务B 两次读到的结果集就不同了

李四正在瞄的时候,张三让他等一下在喵,自己先改一下。李四感觉自己正在瞄的时候,张三总是打断自己,于是就跟张三商量说,你写的时候我不去瞄,我瞄的时候你也不能让我等一下你去改。于是张三就跟李四约定好了,张三写的时候李四不能读,李四读的时候张三不能写。李四在瞄的时候,张三没事干,张三就看哪里写错了,发现写错了自己又不能在李四读的时候去改,然后就把正确答案写到另一种本子上,写完后把正确答案在拿出来,李四一看怎么又多了本子,这就是幻读问题

如何解决幻读问题?

答:串行化,彻底的舍弃并发。就是当事务B读的时候,事务A什么都不能干

3、MySQL提供的隔离级别

MySQL 为了解决并发执行带来的问题,提供了四个隔离级别

  • read uncommitted:不做任何限制,事务之间都是随意并发执行的。并发程度最高,隔离性最低。会产生: 脏读+不可重复读+幻读

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

  • repeatable read:对写和读都加锁了,并发程度又降低了,隔离性又提高了。解决了脏读和不可重复读问题,但可能存在:幻读

  • serializable:严格串行化,并发程度最低,隔离性最高。解决了脏读+不可重复读+幻读问题,但执行速度最慢

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring 是什么?IoC 和 DI的区别

1. Spring 是什么?2. IoC是什么? 2.DI概念说明 1. Spring 是什么? 我们通常讲的Spring指的是Spring Framework(Spring框架),它是一个开源的框架,有着活跃而庞大的社区,这也是它之所谓经久不衰的原因。官方的解读是:Spring官网 翻译过来就是:Spring使Java编程对每…

优维低代码实践:面包屑配置以及菜单配置

优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。 优维…

MySQL的版本从5.7跳到了8.0有哪些原因?

MySQL的版本从5.7跳到了8.0的原因? 一、引言1.1、MySQL是什么?1.2、MySQL 5.7和8.0的历史背景 二、MySQL 8.0的新功能2.1、更好的安全性2.2、更高的性能2.3、更好的可扩展性2.4、JSON支持 三、MySQL 8.0的重要改进3.1、更严格的数据类型检查3.2、其他重要…

【CSS3系列】第七章 · 过渡和动画

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

群晖nas(DS423+)和百度云盘互相自动备份

群晖nas提供了云同步功能,使用该功能,可以将百度云盘和群晖nas设置成互为备份,这样我们nas上的的重要数据就有多了一层保护。 通过设置,可以将nas上的某个目录同步到百度云盘的一个目录中,同步的方向可以自行定义&…

五、浅析[ElasticSearch]底层原理与分组聚合查询

目录 一、ElasticSearch文档分值_score计算底层原理1.boolean model2.relevance score算法2、分析一个document上的_score是如何被计算出来的 二、分词器工作流程1.character filter、tokenizer、token filter2、内置分词器的简单介绍3、定制分词器3.1默认的分词器--standard3.…

Spring 事务的相关配置、传播行为、隔离级别及注解配置声明式事务

目录 一、事务的相关配置 1. 添加测试标签 2. 添加对应方法 3. 测试 二、事务的传播行为 三、事务的隔离级别 四、注解配置声明式事务 1. 注册事务注解驱动 2. 加上注解 3. 配置类代替xml文件中的注解事务支持 4. 测试 往期专栏&文章相关导读 1. Maven系列专栏…

【三维编辑】Editing Conditional Radiance Fields 编辑条件辐射场

Editing Conditional Radiance Fields(ICCV 2021) 作者单位:Steven Liu, Xiuming Zhang, Zhoutong Zhang, Richard Zhang MIT, Adobe Research, CMU 代码地址:https://github.com/stevliu/editnerf 文章目录 摘要前言一、相关工作…

23. 数据结构之位图

前言 之前在讲散列表的时候,提到过位图的概念。位图(Bitmap)作为一种特殊的数据结构,它使用一系列位来表示数据,每个位只有两个状态(0或1)。由于它的高效性和节省空间的特性,位图在…

MySQL事务相关笔记

杂项 InnoDB最大特点:支持事务和行锁; MyISAM不支持事务 介绍 一个事务是由一条或者多条对数据库操作的SQL语句所组成的一个不可分割的单元,只有当事务中的所有操作都正常执行完了,整个事务才会被提交给数据库。事务有如下特性…

使用传统图像处理算法+机器学习进行shadow detection

前言 阴影是图像中常见的现象,它们对于场景理解和分析非常重要。由于阴影区域通常比较暗淡,而且与周围物体区别较大,因此在图像处理和计算机视觉领域中,阴影检测是一个重要的研究方向。传统的阴影检测算法通常基于阈值或边缘检测…

SVM算法的介绍

一、SVM算法的介绍 1.什么是SVM算法? SVM(Support Vector Machine)是一种常见的监督学习算法,用于进行二分类或多分类任务。它的主要思想是找到一个最优的超平面,将不同类别的样本分隔开。 超平面最大间隔介绍&#…

人体姿态估计技术的理解(Human Pose Estimination)

本人毕设题目是人体姿态估计技术的相关课题,本人按照自己对人体姿态估计技术的学习和理解进行论述,如有不足,请大家指正!!! 首先讨论一个问题:什么是姿态估计? “姿势估计?……姿势这个词对…

opencv如何使用GPU的三种方法

我在工作实验涉及到图像和视频处理时,通常使用opencv提供的库来做处理,虽然OpenCV是一个广泛使用的库,它提供了丰富的功能和工具。然而,有时候在处理大量图片或视频时,我们可能会面临速度受限的问题。 opencv执行图像…

【C/C++】之内存管理(超详细练气篇)

个人主页:平行线也会相交💪 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C之路】💌 本专栏旨在记录C的学习路线,望对大家有所帮助🙇‍ 希望我们一起努力、成长&…

基本 SQL 命令 、重要的 SQL命令、SQL 约束 及 SQL语句 的 执行顺序

学习目标: 学习目标如下: SQL语句执行顺序 学习内容: 基本 SQL 命令: FROMONJOINWHEREGROUP BYAGG_FUNCWITHHAVINGSELECT 从数据库中提取数据UNIONDISTINCTORDER BY 排序LIMIT 重要的sql命令: 1、SELECT - 从数据…

Finalshell安全吗?Xshell怎么样?

文章目录 一、我的常用ssh连接工具二、Xshell2.1 下载:认准官网2.2 Xshell 配置2.3 Xftp和WinSCP 一、我的常用ssh连接工具 之前讲过: 【服务器】远程连接选SSH(PUTTY、Finalshell、WinSCP) 还是 远程桌面(RDP、VNC、…

解决 CentOS/Alma 安装 libpcap-devel 报错:No match for argument: libpcap-devel

环境:Alma 8.5、Centos 7.x 解决方案 Linux 安装软件的时候,需要 libpcap-devel 这个组件,执行命令:yum install libpcap-devel ,然后报错如下: Last metadata expiration check: 0:05:24 ago on Mon 12…

【算法】数学相关知识总结

文章目录 gcd 和 lcm取模运算 %求一个点和一片矩形区域之间的最短距离 本文用于记录一些关于算法题中偶尔被使用到的数学相关知识。 gcd 和 lcm gcd 和 lcm 分别是 最大公约数(Greatest common divisor) 和 最小公因数(Least Common Multip…

机器学习——决策树算法

一、实验目的 掌握如何实现决策树算法,用并决策树算法完成预测。 二、实验内容 本次实验任务我们使用贷款申请样本数据表,该数据表中每列数据分别代表ID、年龄、高薪、有房、信贷情况、类别,我们根据如下数据生成决策树,使用代…
最新文章