问题:请讲下mysql的事务是如何实现的

分析:该问题主要考察对事务的理解及实现方式;

回答要点:

主要从以下几点去考虑,

1、对事务的概念的理解?

2、事务的实现方式?

讲到mysql的事务,很快可以想到事务的4大特性,那就是ACID,具体说来就是原子性、一致性、隔离性、持久性。也就是说事务就是围绕这4个特性来展开的。其中隔离性中又定义了隔离级别,有读未提交、读已提交、可重复度、可串行化这样4个级别。

对于事务的4个特性,原子性、一致性、持久性说的都是mysql的可靠性方面的考量,对应隔离性说的则是在并发场景下,同时有读和写的情况如何做到数据隔离,到底数据要隔离到什么程度,则就有了隔离级别的概念。

mysql要保证事务的4大特性,主要使用了日志(redo log、undo log)、锁技术、MVCC技术

日志

说到日志,平时接触最多的是mysql的binlog日志,主要用来记录mysql执行的更新语句,用在主从复制的场景比较多。今天来说的日志却不包含binlog,今天来说redo log和undo log

redo log

又叫重做日志,用来实现事务的持久性,包含重做缓冲区和重做日志文件两部分,前者在内存中,后者在磁盘。mysql在事务提交前会把所有的修改信息都记录在redo log中。

为什么要引入redo log那,原来mysql为了提高性能不会把每次的修改都实时同步到磁盘中,而是先存到buffer pool中,然后后台有一个线程来进行buffer pool和磁盘之间的同步。这样就存在一个问题,如果还没来得及进行buffer pool和磁盘的同步,机器宕机了怎么办,那么数据岂不是要丢失,为了解决这个问题,引入了redo log,在事务开始时把修改记录到重做缓冲区,在事务提交前将重做缓冲区的内容刷到磁盘上,不禁要问这不是多此一举吗,我实时把buffer pool中的内容写入磁盘不也可以达到这样的目的,哈哈,肯定不是这样的,因为redo log的文件是顺序写,而buffer pool和磁盘的写是随机写,顺序写的速度要比随机写快很多,所以这就是引入redo log的目的。

undo log

又叫回滚日志,用来保证事务的原子性。用来记录数据被修改前的信息,和redo log正好相反,redo log是记录修改以后的记录。undo log记录的是数据的逻辑变化,为了在发生错误时进行数据的回滚操作。

锁技术

当多个请求同时到达mysql服务器,如果都是读请求,那么可以不采取任何的措施,如果既有读请求又有写请求的前提下,必须要有一种机制来规范读写请求,不然很容易造成数据的不一致,这时就有了锁机制,使用读锁和写锁进行控制即可,读锁对所有的读操作都是共享的,不会造成阻塞;写锁则是排他锁,不能做到写读、写写并行。

MVCC

MVCC叫做多版本并发控制,通过在每条记录的后边保存两个隐藏的列来实现,一个保存行创建的时间,一个保存行的过期时间,保存的不是时间而是系统版本号,通过MVCC来做到读写分离。

在事务的4大特性中隔离性是最复杂的,4种隔离级别分别定义了一个事务种的修改哪些是事务之间可见的,哪些是事务之间不可见的。

读未提交

读未提交是读的情况下不加任何的锁,所以会读到其他事务未提交的数据,造成脏读数据

读已提交

在该隔离级别下,读操作是不加锁的,采用MVCC的方式进行读取;写操作加排他锁,也就是写锁。该级别会产生不可重复读和幻读的情况。

不可重复读指的是两次的读数据内容发生了变化,行数未变,针对update操作;幻读是两次的读数据内容未变,行数发生了变化,针对insert、delete操作;

在读已提交隔离级别下实现的MVCC机制是这样的,每次的select操作都会生成一个新的版本号,所以每次的读取都是不同的副本,那么就存在不可重复读和幻读

可重复读(mysql默认隔离级别)

在一个事务中多次的读取结果是一样的。有两种机制可以实现这种效果,分别是读写锁和MVCC。

使用读写锁实现的话,优点是实现简单,但是读写无法并行。

使用MVCC机制实现优点是实现复杂,但读写可并行。在这种情况下实现的MVCC,每次的select操作都是使用最开始的版本号,所以每次的读取都是相同的数据,不会产生不可重复读,但是会产生幻读的情况,mysql通过next-key锁(行锁+间隙锁)的方式解决了幻读。

参考:https://www.sohu.com/a/316482862_663371

https://www.cnblogs.com/zhiqian-ali/p/5668199.html

java面试一日一题:mysql事务是如何实现的的更多相关文章

  1. java面试一日一题:mysql中常用的存储引擎有哪些?

    问题:请讲下mysql中常用的引擎有哪些? 分析:该问题主要考察对mysql存储引擎的理解,及区别是什么? 回答要点: 主要从以下几点去考虑, 1.mysql的存储引擎的基本概念? 2.mysql中常 ...

  2. java面试一日一题:讲下mysql中的undolog

    问题:请讲下mysql中undo log的作用 分析:mysql中有很多日志,例,bin log undo log redo log,要弄清楚这些日志的作用,就要了解这些日志出现的背景及要解决的问题: ...

  3. java面试一日一题:讲下在什么情况下会发生类加载

    问题:请讲下在什么情况下会发生类加载? 分析:该问题主要考察对java中类加载的知识,什么是类加载,为什么会发生类加载,什么情况下发生类加载? 回答要点: 主要从以下几点去考虑 1.什么是类加载: 2 ...

  4. java面试一日一题:java中垃圾回收算法有哪些

    问题:请讲下在java中有哪些垃圾回收算法 分析:该问题主要考察对java中垃圾回收的算法以及使用场景 回答要点: 主要从以下几点去考虑, 1.GC回收算法有哪些 2.每种算法的使用场景 3.基于垃圾 ...

  5. java面试一日一题:java中的垃圾回收器

    问题:请讲下java中垃圾回收器有哪些? 分析:该问题主要考察hotspot虚拟机下实现的垃圾回收器 回答要点: 主要从以下几点去考虑, 1.垃圾回收器的种类 2.每种垃圾回收器的着重点是什么 前边的 ...

  6. java面试一日一题:讲对mysql的MVCC的理解

    问题:请讲下对mysql中MVCC的理解 分析:这个问题要回答的是对MVCC的理解,以及MVCC解决了什么问题这几个方面入手. 回答要点: 主要从以下几点去考虑, 1.什么是MVCC? 2.MVCC用 ...

  7. java面试一日一题:请讲下对mysql的理解

    问题:请讲下对mysql的理解 分析:该问题主要考察对mysql的理解,基本概念及sql的执行流程 回答要点: 主要从以下几点去考虑, 1.mysql的整体架构? 2.mysql中每一个组件的作用? ...

  8. java面试一日一题:mysql中的自增主键

    问题:请讲下mysql中的自增主键 分析:该问题主要考察对mysql中自增主键的掌握,使用场景及如何设置 回答要点: 主要从以下几点去考虑 1.什么自增主键 2.使用场景是什么: 3.innodb_a ...

  9. java面试一日一题:讲下mysql中的索引

    问题:请讲下mysql中的索引 分析:mysql中有很多索引,要对对这些索引有所掌握,还要弄清楚每种索引的本质? 回答要点: 主要从以下几点去考虑 1.索引的本质是什么 2.mysql的索引分类: 3 ...

随机推荐

  1. WebAssembly in Action

    WebAssembly in Action 数据加密,反爬虫,防盗链,版权保护,数据追踪,埋点 blogs 加密,js 禁用检测,权限控制 WebAssembly 防盗链 wasm online id ...

  2. 基本ILS面的评估

    一.定义与用途 基本ILS面是ICAO DOC8168飞行程序设计规范中提到的一种限制面. 它相当于附件14中代码为3或4的精密进近跑道所规定的障碍物限制面的子集. 包含:进近面(分为两部分).过渡面 ...

  3. c/c++ 之静态库

    静态库 编译成目标文件(未链接) g++ -c a.cc b.cc c.cc d.cc #生成 a.o b.o c.o d.o 将目标文件打包为静态库 ar rs libxxx.a a.o b.o c ...

  4. CMD 中运行 xx 命令提示 不是内部或外部命令,也不是可运行的程序或批处理文件的问题

    出现这个问题的原因一般有2个 这个命令依赖某个软件,而你又没有安装 这里你只需要去下载安装好对应的软件,基本上就可以解决上面的问题了. 软件安装好了,但是需要配置环境变量 第二个原因就按照下图,去设置 ...

  5. E百科 | 基于MEC的边缘AI服务

    简介: 阿里云边缘计算团队付哲解读5G下热门场景:边缘AI.作者:阿里云付哲,计算机科学与技术专业博士后,在流量检测.资源调度领域有深入研究,其论文<Astraea: Deploy AI Ser ...

  6. Pygame基础(1)

    Pygame是Python的一个很常用的游戏框架,今天我来讲一讲Pygame的基础知识 Pygame的官网:https://www.pygame.org/news Pygame的下载 打开cmd输入p ...

  7. 利用CORDIC算法计算三角函数

    这里主要先介绍如何利用CORDIC算法计算固定角度\(\phi\)的\(cos(\phi)\).\(sin(\phi)\)值.参考了这两篇文章[1].[2]. 一般利用MATLAB计算三角函数时,用\ ...

  8. js一周时间表

    <div class="datetext"> <img class="dateLeft" src="./images/dateLef ...

  9. java基础知识 + 常见面试题

    准备校招面试之Java篇 一. Java SE 部分 1.1 Java基础 1. 请你解释Object若不重写hashCode()的话,hashCode()如何计算出来的? Object 的 hash ...

  10. 五十:代码审计-PHP无框架项目SQL注入挖掘技巧

    代码审计教学计划: 审计项目漏洞Demo->审计思路->完整源码框架->验证并利用漏洞 代码审计教学内容: PHP,JAVA网站应用,引入框架类开发源码,相关审计工具及插件使用 代码 ...