java面试一日一题:mysql事务是如何实现的
问题:请讲下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事务是如何实现的的更多相关文章
- java面试一日一题:mysql中常用的存储引擎有哪些?
问题:请讲下mysql中常用的引擎有哪些? 分析:该问题主要考察对mysql存储引擎的理解,及区别是什么? 回答要点: 主要从以下几点去考虑, 1.mysql的存储引擎的基本概念? 2.mysql中常 ...
- java面试一日一题:讲下mysql中的undolog
问题:请讲下mysql中undo log的作用 分析:mysql中有很多日志,例,bin log undo log redo log,要弄清楚这些日志的作用,就要了解这些日志出现的背景及要解决的问题: ...
- java面试一日一题:讲下在什么情况下会发生类加载
问题:请讲下在什么情况下会发生类加载? 分析:该问题主要考察对java中类加载的知识,什么是类加载,为什么会发生类加载,什么情况下发生类加载? 回答要点: 主要从以下几点去考虑 1.什么是类加载: 2 ...
- java面试一日一题:java中垃圾回收算法有哪些
问题:请讲下在java中有哪些垃圾回收算法 分析:该问题主要考察对java中垃圾回收的算法以及使用场景 回答要点: 主要从以下几点去考虑, 1.GC回收算法有哪些 2.每种算法的使用场景 3.基于垃圾 ...
- java面试一日一题:java中的垃圾回收器
问题:请讲下java中垃圾回收器有哪些? 分析:该问题主要考察hotspot虚拟机下实现的垃圾回收器 回答要点: 主要从以下几点去考虑, 1.垃圾回收器的种类 2.每种垃圾回收器的着重点是什么 前边的 ...
- java面试一日一题:讲对mysql的MVCC的理解
问题:请讲下对mysql中MVCC的理解 分析:这个问题要回答的是对MVCC的理解,以及MVCC解决了什么问题这几个方面入手. 回答要点: 主要从以下几点去考虑, 1.什么是MVCC? 2.MVCC用 ...
- java面试一日一题:请讲下对mysql的理解
问题:请讲下对mysql的理解 分析:该问题主要考察对mysql的理解,基本概念及sql的执行流程 回答要点: 主要从以下几点去考虑, 1.mysql的整体架构? 2.mysql中每一个组件的作用? ...
- java面试一日一题:mysql中的自增主键
问题:请讲下mysql中的自增主键 分析:该问题主要考察对mysql中自增主键的掌握,使用场景及如何设置 回答要点: 主要从以下几点去考虑 1.什么自增主键 2.使用场景是什么: 3.innodb_a ...
- java面试一日一题:讲下mysql中的索引
问题:请讲下mysql中的索引 分析:mysql中有很多索引,要对对这些索引有所掌握,还要弄清楚每种索引的本质? 回答要点: 主要从以下几点去考虑 1.索引的本质是什么 2.mysql的索引分类: 3 ...
随机推荐
- linux bash which
linux bash which https://linuxize.com/post/linux-which-command/ Linux which command is used to ident ...
- jsbridge 原理 & 通信原理
jsbridge 原理 & 通信原理 Hybrid 方案是基于 WebView 的,JavaScript 执行在 WebView 的 Webkit 引擎中; 因此,Hybrid 方案中 JSB ...
- nasm astrrev函数 x86
xxx.asm %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain export ast ...
- ng mock服务器数据
angualr文档 in-memory-web-api 文档 安装 yarn add angular-in-memory-web-api -S src/app/app.module.ts import ...
- NGK钱包真的安全吗?
对于数字资产持有者而言,资产的安全永远是首要的,因而数字钱包的安全性显得尤为重要.数字钱包分为冷钱包和热钱包两种.热钱包叫做在线钱包,而冷钱包被称为离线钱包,也叫硬件钱包.数字钱包一旦被盗,被追回的概 ...
- JULLIAN MURPHY:拥有良好的心态,运气福气便会自来
JULLIAN MURPHY是星盟全球投资公司的基金预审经理,负责星盟投资项目预审,有着资深的基金管理经验,并且在区块链应用的兴起中投资了多个应用区块链技术的公司. JULLIAN MURPHY认为往 ...
- git设置、查看、取消代理
设置代理: git config --global http.proxy 'socks5://127.0.0.1:1080' git config --global https.proxy 'sock ...
- SpringCloud之服务网关
1.zuul 1.1定义 zuul叫路由网关,它包含对请求的路由和过滤的功能. 路由负责将外部的请求转发到具体的微服务实例上,是实现外部访问统一入口的基础.而过滤是负责对请求的处理过程进行干预,是实现 ...
- IVMS-5000海康平台安装
某学校系统因中勒索病毒重装监控系统平台 一 安装前准备 二 数据库安装 采用免安装版本安装,原先平台采用免安装版mysql 5.6.24 ,学校IT管理员将数据库文件完全复制,用虚拟机将数据库搭 ...
- go http库 设置代理
func ProxyTest() { proxyAddr := "http://your IP:8080/" httpUrl := "http://your target ...