MySQL~事务的四大特性和隔离级别

事务的四大特性

1.原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样,通过undo log实现。

2.持久性:事务处理结束后,数据库会把对数据的修改写到磁盘上,即便系统故障也不会丢失,保证了数据的持久性,通过redo logo来保证。

3.隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以让不同的事务看到不同的数据内容,防止多个事务并发执行导致数据不一致的问题。通过MVCC多版本并发控制实现,用到了ReadView读视图和undo log里面的历史版本链。

4.一致性:指事务操作前后,是从一个一致性的状态到另一个一致性的状态,它是由原子性,持久性,隔离性来共同保证一致性的。

  • 原子性保证一致性:比如说银行转账,一方扣钱一方加钱,两条SQL属于一个事务,为了保证双方金额的一致性,两条SQL必须同时执行成功,或者就都不执行,这就保证了前后数据的一致性。
  • 持久性保证一致性:比如我买了一个月以后回家的飞机票,一个月后买票的数据没了,但是我钱也花了,这就导致了数据的不一致。数据库要保证一个月后我买票的数据还在,就是通过持久性来保证的。(把买票的数据保存到磁盘上去)
  • 隔离性保证一致性:如果没有隔离性,一致性同样得不到保证。比如在统计考试成绩的时候,一个事务里面,两条SQL,一条统计所有科目的平均分,一条统计语数英三门课的平均分。如果没有隔离性,一开始数学是60分,平均分统计完后,数学被其他事务改成了100分,后一条统计语数英三门课的平均分的时候,使用的数学成绩就和之前的不一样了,这就导致了不一致性。所以需要隔离性来保证事务的一致性。

事务的隔离级别

事务并行时会出现的问题

脏读:一个事务读取到了另一个事物修改后但是还没有提交的数据,这就发生了脏读。此时如果你发生回滚,那我读到的就是过期的数据。

不可重复读:在一个事务内,多次读取同一个数据,发现读取到的数据不一样,就发生了不可重复读的情况。事务A第一次读的是时候是100,然后事务B把这个值修改成了200,然后提交,事务A再读的时候就变成200了,重复读数据但是读到的却是不同的值。

幻读:一个事务内多次统计符合某个条件的记录数量,发现前后统计的数量不一致。比如事务A一开始统计不及格的人数有3个,然后事务B插入了一个不及格的人员信息,提交了事务,此时事务A再查不及格的记录数就变成4个了。

隔离级别

  • 读未提交(read uncommitted),指一个事务还没提交时,它做的修改就能被其他事务看到;
  • 读提交(read committed),指一个事务提交之后,它做的修改才能被其他事务看到;
  • 可重复读(repeatable read),指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,我可以重复读,不会读取到不一样的数据。MySQL InnoDB 引擎的默认隔离级别;
  • 串行化(serializable );会对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行;

隔离级别越高,越不容易出问题,但是相对的效率也会更低。

  • 在「读未提交」隔离级别下,可能发生脏读、不可重复读和幻读现象;
  • 在「读提交」隔离级别下,可能发生不可重复读和幻读现象,但是不可能发生脏读现象;
  • 在「可重复读」隔离级别下,可能发生幻读现象,但是不可能脏读和不可重复读现象;
  • 在「串行化」隔离级别下,脏读、不可重复读和幻读现象都不可能会发生。

如何实现隔离级别

  • 读未提交:要读取到未提交的修改数据,所以直接读最新的数据就行
  • 串行化:通过加锁的方式实现
  • 读提交和可重复读:通过MVCC(多版本并发控制)来实现的,用到了Undo log里面的历史版本链,还有ReadView读快照。(PS,准确一点还用到了几个隐藏字段,通过隐藏字段访问到历史版本链和最近修改记录的事务ID)

        可重复读的是每次事务启动都生成一个ReadView,后续整个事务就使用这个ReadView。而读提交是每次读取数据的时候,会重新生成一个ReadView。

ReadView中有4个字段

  • create_transaction_id,指创建该ReadView的事务id
  • m_ids:当前活跃且未提交的事务列表
  • min_transaction_id,当前活跃且未提交的事务列表中事务id的最小值
  • max_transaction_id,创建ReadView时当前数据库中要分配给下一个事务的id。

然后每条记录里面还有两个隐藏字段,

  • transaction_id表示最近一次修改该记录的事务id
  • roll_pointer指针,指向undo log里面该记录的历史版本链,记录该记录被修改的不同版本,用链表的形式连接起来。

开始

 

        当一个事务访问该记录的时候,首先获取最近修改该记录的事务id,就是transaction_id字段,然后获取到undo log历史版本链中的最新版本。

  1. 如果是自身,那当然允许访问
  2. 如果小于min_transaction_id,表示该版本在创建ReadView之前就创建了,固然允许访问。
  3. 如果大于max_transaction_id,表示该版本是在创建了ReadView之后才生成的,固然不允许访问,跳转到下一个历史版本
  4. 如果在min_transaction_id和max_transaction_id之间,则需要判断当前修改过该记录的事务有没有提交,提交了就可以访问,没有提交就不能访问。

        可以查看transaction_id是否在m_ids列表中,如果在,说明该事务还在活跃,没有提交,就不能访问该版本;如果不在,说明该事务已经提交,固可以访问。

        就经过这样一个过程,最终会找到当前事务可以访问的那个版本来访问。

 

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

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

相关文章

Linux 终端命令之文件浏览(2) more

Linux 文件浏览命令 cat, more, less, head, tail,此五个文件浏览类的命令皆为外部命令。 hannHannYang:~$ which cat /usr/bin/cat hannHannYang:~$ which more /usr/bin/more hannHannYang:~$ which less /usr/bin/less hannHannYang:~$ which head /usr/bin/he…

初学vue3时应该注意的几个问题

初学vue3时应该注意的几个问题 声明响应式 响应式数据的声明在vue2的时候很简单,在data中声明就行了。但现在可以使用多个方式。 reactive用于声明Object, Array, Map, Set; ref用于声明String, Number, Boolean 使用reactive来声明基础数据类型(Str…

SpringCloud实用篇3----Docker

1.初识Docker 1.1 什么是Docker 微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署,环境不一定一致…

使用关键词一站式精准搜索指定期刊或会议论文集中的论文

问题描述 如题,例如,想要找点某主题的相关文献,当然要看本领域权威刊物了,假如你想从CCF人工智能类A级期刊找点文本相似度的论文,逐个点开期刊主页进行搜索,那就有点繁琐,不是一站式。 解决方…

APP外包开发的H5开发框架

跨平台移动应用开发框架允许开发者使用一套代码在多个操作系统上构建应用程序,从而节省时间和资源。以下是一些常见的跨平台移动应用开发框架以及它们的特点,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司&#xff0…

neo4j的CQL命令实例演示

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

大数据-玩转数据-Redis 安装与使用

一、说明 大多数企业都是基于Linux服务器来部署项目,而且Redis官方也没有提供Windows版本的安装包。因此课程中我们会基于Linux系统来安装Redis. 此处选择的Linux版本为CentOS 7. Redis的官方网站地址:http://download.redis.io/releases 二、下载 m…

冶金作业VR虚拟仿真厂家

对于高风险行业来说,开展安全教育培训是企业的重点工作,传统培训逐渐跟不上时代变化和工人需求,冶金安全VR模拟仿真培训系统作为一种新型的教育和培训工具,借助VR虚拟现实技术为冶金行业的工人提供一个安全、高效的培训环境。 冶金…

(文章复现)基于灰狼算法(GWO)的交直流混合微网经济调度matlab代码

参考文献: [1]高瑜,黄森,陈刘鑫等.基于改进灰狼算法的并网交流微电网经济优化调度[J].科学技术与工程, 2020,20(28):11605-11611. [2]邓长征,冯朕,邱立等.基于混沌灰狼算法的交直流混合微网经济调度[J].电测与仪表, 2020, 57(04):99-107. 这两篇文章不管是从模型、…

JUL 日志 - 最简单易用的Java日志框架

在正式的生产环境下是不能使用 System.out 进行日志记录的 因为 System.out 不能提供时间、线程、执行过程 等信息,如果要手动打印输出则会非常麻烦 而日志就帮我们把这些事给干了 接下来我们学一个最简单的日志框架 JUL JUL全称Java util Logging是java原生的日志框…

Centos7.9安装lrzsz进行文件传输---Linux工作笔记059

这里咱们lrzsz命令,需要用来进行文件传输,因为如果不安装这个命令的话,那么 传输安装包什么的就不方便因为只有少数传输工具,才支持,直接拖拽的.没有的时候就可以用这个工具,用命令来传输 直接就是: sz 文件名 就可以把文件下载下来 rz 选择一个文件, 就可以把文件上传到当…

nacos升级开启鉴权后,微服务无法连接的解决方案

版本: 软件版本号备注spring boot2.2.5.RELEASEspring-cloudHoxton.SR3spring-cloud-alibaba2.2.1.RELEASEnacos2.0.1从1.4.2版本进行升级。同时作为注册中心和配置中心 一、升级nacos版本,开启鉴权 1.在application.properties配置文件开启鉴权&…

LeetCode 34题:在排序数组中查找元素的第一个和最后一个位置

目录 题目 思路 代码 C语言 Python 题目 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(…

腾讯出品Pag动画框架在Android端的使用-初级

Pag动画框架作为一个第三方框架,它的优缺点与Lottie是相似,此处不过多赘述。如果你们的项目中打算用了,肯定是经过了一定的调研的。Pag动画框架分几个版本,有免费的有收费的。我们目前用的社区免费版,只用来展示Pag动画…

大数据面试题:说下Spark中的Transform和Action,为什么Spark要把操作分为Transform和Action?

面试题来源: 《大数据面试题 V4.0》 大数据面试题V3.0,523道题,679页,46w字 可回答:Spark常见的算子介绍一下 参考答案: 我们先来看下Spark算子的作用: 下图描述了Spark在运行转换中通过算…

uniapp的UI框架组件库——uView

在写uniapp项目时候,官方所推荐的样式库并不能满足日常的需求,也不可能自己去写相应的样式,费时又费力,所以我们一般会去使用第三方的组件库UI,就像vue里我们所熟悉的elementUI组件库一样的道理,在uniapp中…

(6)所有角色数据分析-6

http://t.csdn.cn/KrurEhttp://t.csdn.cn/KrurE (5)中的页面,倾向于向用户展示所有数据,但却没有对数据进行比较、分析,用户不能直观的感受到各种数据之间的关系与变化幅度,所以,下面将向用户提…

TCPDF生成PDF文件,含jpjraph生成雷达图

TCPDF生成PDF文件,含jpjraph生成雷达图 依赖自行安装 "tecnickcom/tcpdf": "^6.6","amenadiel/jpgraph": "4"雷达图生成 中文字体添加安装 没有封装,只作为测试案例展示 // 创建新的PDF文档$pdf new \TCPD…

中心极限定理例题

关于大数定律的两个题目。 例1 注意牢记公式&#xff1a; P { X } P { ∑ i 1 n x i − n μ n σ < x } ∫ − ∞ x e − x 2 2 d x 2 π P\{ X\} P \{\frac { \sum_{i1}^{n} x_i - n \mu}{\sqrt {n} \sigma} < x \} \frac {\int _{-\infty} ^{x} e ^{- \frac {x^…