前言

现如今JAVA开发工程师的数量越来越多,但大多数工程师平时做的工作都是简单的CRUD,当你一直处于这种舒适的环境中不追求进步的时候,如果哪一天你突然想要改变环境,换个工作,去与面试官当面聊技术的时候,你会发现自己什么都不会!

可能我们经常会被面试官问到:“你懂事务的ACID吗?”

你回答:“ACID不就是原子性、一致性、隔离性和持久性嘛,这有什么好说的。”

当你这么回答的时候,面试官微微一笑,又问到:“说的不错,那你能具体解释一下吗?”

你支支吾吾半天也没有说的特别清楚。

面试官有些不耐烦:“好了,我知道了,那你能和我说说事务的隔离级别吗?”

你突然发现自己说不出来什么,想了想,还是回去准备准备再面试吧。

小伙伴们可以思考一下,如果是你,可以很好的回答这个问题吗?如果不确定,就与王子一起深入的研究一下吧,绝对让你印象深刻。

事务的ACID

假设现在面试官让我们说一说什么是事务的ACID,我们该怎么回答呢?

首先ACID指的是原子性、一致性、隔离性和持久性

A就是Atomic,原子性说白了就是一堆sql,要么一起执行成功,要么就都不执行,不存在其中一条执行成功的情况。

C就是Consistency,一致性是针对数据来讲的,可以理解成sql执行之前和执行之后的数据必须是准确的,不能有误差。

I就是Isolation,隔离性,就是说两个事务之间互不干扰。

D就是Durability,持久性,事务执行成功了,当然要保证修改后的数据有效了,所以要把数据保存起来。

面试官听了我们的讲解,觉得说的还不错,接着就来让我们再说一下事务的隔离级别。

事务的隔离级别

事务的隔离级别同样有四个,分别是:读未提交、读已提交(不可重复读)、可重复读、串行化

读未提交:这个很好理解,就是说某个事务修改了一条数据,还没有提交的时候,其他事务就能读取到修改后的数据,术语上也被称为脏读;

读已提交:字面意思,就是事务修改了数据并提交之后,其他事务才能查询到修改后的数据。那为什么它又叫不可重复读呢?因为A事务修改数据提交之后,其他事务是可以直接读取到的,也就是说事务B刚开始读取的数据是1,执行过程中数据被事务A修改成了2,这个时候事务B再读取的时候获取到的是2而不是1,也就是说重复读取数据可能出现数据的不一致。

可重复读:理解了不可重复读,可重复读就很容易理解了,就是说一个事务重复读取同一个数据可以保证读取到的值与最开始读取到的值是一致的。

串行化:串行化针对的是数据的插入,比如说一个事务批量修改某个字段的值为2,但同时另一个事务在执行插入操作,插入的这个字段的值是1,这就导致了最终结果有一行数据这个字段的值是错误的,这种情况术语上被称为幻读。而解决幻读的方法就是串行化了,串行化后事务只能串行运行,不能并行操作。

面试官听了我们这样的解释之后,毫不掩饰的对我们表示了认可,但我们发现他还在思考怎么提问题。

于是我们先下手为强,准备抛出一个大招,向面试官提出“其实我对可重复读在Mysql中是如何实现的比较感兴趣,所以我研究了一下这一部分,也跟您聊聊吧”。

MySQL是如何实现可重复读的

我们知道Mysql数据库默认的隔离级别就是可重复读。

MySql的内部其实是通过MVCC机制来实现可重复读的,MVCC的意思是多版本并发控制。

Mysql的Innodb引擎会在每行数据的最后增加两个隐藏列,一个是行的创建时间,一个是行的删除时间,但这两个列中保存的其实不是时间,而是事务id,事务id是自增且唯一的。

那么假设当前数据的创建事务id为1,删除事务id为3,如下:

id  name  创建事务id  删除事务id

1   张三          1         3 

那么如果正在执行的事务id为2,来查询这条数据是可以查得到的,因为当前执行的事务会查询事务id<=2的数据快照,所以无论后续事务对这条数据做什么操作,都不影响事务id为2的事务对这条数据的查询。

这就是MVCC机制的实现方式。

面试官听完你的这段回答之后,眼睛一下子亮了起来,让我们明天来上班吧。

总结

今天王子想和大家讨论的问题到这里就结束了,没有什么图片的演示,也没有什么代码的展示。

主要是以模拟面试现场的方式与大家分享了ACID与隔离级别的知识,希望可以让小伙伴们印象深刻。

如果有什么问题也欢迎联系我,让我们共同探讨。

往期文章推荐:

JVM专栏

消息中间件专栏

并发编程专栏

小白也能看懂的ACID与隔离级别的更多相关文章

  1. 小白也能看懂的插件化DroidPlugin原理(二)-- 反射机制和Hook入门

    前言:在上一篇博文<小白也能看懂的插件化DroidPlugin原理(一)-- 动态代理>中详细介绍了 DroidPlugin 原理中涉及到的动态代理模式,看完上篇博文后你就会发现原来动态代 ...

  2. 小白也能看懂的插件化DroidPlugin原理(三)-- 如何拦截startActivity方法

    前言:在前两篇文章中分别介绍了动态代理.反射机制和Hook机制,如果对这些还不太了解的童鞋建议先去参考一下前两篇文章.经过了前面两篇文章的铺垫,终于可以玩点真刀实弹的了,本篇将会通过 Hook 掉 s ...

  3. 小白也能看懂的Redis教学基础篇——朋友面试被Skiplist跳跃表拦住了

    各位看官大大们,双节快乐 !!! 这是本系列博客的第二篇,主要讲的是Redis基础数据结构中ZSet(有序集合)底层实现之一的Skiplist跳跃表. 不知道那些是Redis基础数据结构的看官们,可以 ...

  4. 【vscode高级玩家】Visual Studio Code❤️安装教程(最新版🎉教程小白也能看懂!)

    目录 如果您在浏览过程中发现文章内容有误,请点此链接查看该文章的完整纯净版 下载 Linux Mac OS 安装 运行安装程序 同意使用协议 选择附加任务 准备安装 开始安装 安装完成 如果您在浏览过 ...

  5. 小白也能看懂的Redis教学基础篇——做一个时间窗限流就是这么简单

    不知道ZSet(有序集合)的看官们,可以翻阅我的上一篇文章: 小白也能看懂的REDIS教学基础篇--朋友面试被SKIPLIST跳跃表拦住了 书接上回,话说我朋友小A童鞋,终于面世通过加入了一家公司.这 ...

  6. 搭建分布式事务组件 seata 的Server 端和Client 端详解(小白都能看懂)

    一,server 端的存储模式为:Server 端 存 储 模 式 (store-mode) 支 持 三 种 : file: ( 默 认 ) 单 机 模 式 , 全 局 事 务 会 话 信 息 内 存 ...

  7. 小白也能看懂插件化DroidPlugin原理(一)-- 动态代理

    前言:插件化在Android开发中的优点不言而喻,也有很多文章介绍插件化的优势,所以在此不再赘述.前一阵子在项目中用到 DroidPlugin 插件框架 ,近期准备投入生产环境时出现了一些小问题,所以 ...

  8. 小白也能看懂的插件化DroidPlugin原理(一)-- 动态代理

    前言:插件化在Android开发中的优点不言而喻,也有很多文章介绍插件化的优势,所以在此不再赘述.前一阵子在项目中用到 DroidPlugin 插件框架 ,近期准备投入生产环境时出现了一些小问题,所以 ...

  9. 小白都能看懂的tcp三次握手

    众所周知,TCP在建立连接时需要经过三次握手.许多初学者经常对这个过程感到混乱:SYN是干什么的,怎么一会儿是1一会儿是0?怎么既有大写的ACK又有小写的ack?为什么ACK在第二次握手才开始出现?初 ...

随机推荐

  1. Log4Net日志的简单使用示例

    前言 源码参考示例地址 http://www.51aspx.com/Code/log4netusedemo/2707 本例博客园源码 https://files.cnblogs.com/files/m ...

  2. [.NET] - EventLog.EntryWritten Event

    刚看到在MSND论坛上有人问一个EventLog.EntryWritten Event相关的问题,说是在2015触发了一个2013年的EventWritten的事件,比较好奇,然后查看了下这个类: h ...

  3. git 清除本地git commit的内容

    由于我经常git add . , 然后再git commit -m "文字说明",这样有时候代码嵌套再另一个项目里面,就会把外面的项目一起提交了,导致提交的代码不是我想要的.小菜鸟 ...

  4. 超长JVM总结,面试必备

    什么是JVM JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回收,堆 和 一个存储方法域.JVM 是运行在操作系统之上的,它与硬件没有直接的交互. ...

  5. CI持续集成理论知识

    (1)什么是CI What is CI? CI就是持续集成,持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过 ...

  6. sqlite嵌入式数据库简介及特性

    p.p1 { margin: 0; font: 12px "Helvetica Neue"; color: rgba(69, 69, 69, 1) } p.p2 { margin: ...

  7. JAVA初始化及类的加载

    在许多传统语言中,程序是作为启动过程的一部分被加载的.然后是初始化,紧接着程序开始运行.这些语言的初始化过程必须小心控制,以确保定义为static的东西,其初始化顺序不会造成麻烦.例如C++期望一个s ...

  8. springboot项目Invalid bound statement (not found): com.xxxx.dao.xxxDAO.xxx解决方法

    1.首先判断自己的Dao和mapper的对应关系,注意要一一对应的. 2.配置信息出现问题,注意配置信息填写: 3.记住要细心细心,细心,重要的事情说三遍.

  9. jpa 主键重复导致查询list的数据总是重复第一条数据

    背境: JPA 读取 Oracle 中的视图,同一条sql, 在数据库 IDE (PLSql)读出 878 条记录并正常显示,代码依然保存了 878 条记录,但所有记录均一样,即数据库中第一条记录. ...

  10. .NET 云原生架构师训练营(模块二 基础巩固 MongoDB 聚合)--学习笔记

    2.5.5 MongoDB -- 聚合 排序 索引类型 创建索引 排序 // 升序 db.getCollection('author').find({}).sort({"age": ...