Java核心技术面试精讲
杨晓峰
前Oracle首席工程师
立即订阅
43139 人已学习
课程目录
已完结 43 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 以面试题为切入点,有效提升你的Java内功
免费
模块一 Java基础 (14讲)
第1讲 | 谈谈你对Java平台的理解?
第2讲 | Exception和Error有什么区别?
第3讲 | 谈谈final、finally、 finalize有什么不同?
第4讲 | 强引用、软引用、弱引用、幻象引用有什么区别?
第5讲 | String、StringBuffer、StringBuilder有什么区别?
第6讲 | 动态代理是基于什么原理?
第7讲 | int和Integer有什么区别?
第8讲 | 对比Vector、ArrayList、LinkedList有何区别?
第9讲 | 对比Hashtable、HashMap、TreeMap有什么不同?
第10讲 | 如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全?
第11讲 | Java提供了哪些IO方式? NIO如何实现多路复用?
第12讲 | Java有几种文件拷贝方式?哪一种最高效?
第13讲 | 谈谈接口和抽象类有什么区别?
第14讲 | 谈谈你知道的设计模式?
模块二 Java进阶 (16讲)
第15讲 | synchronized和ReentrantLock有什么区别呢?
第16讲 | synchronized底层如何实现?什么是锁的升级、降级?
第17讲 | 一个线程两次调用start()方法会出现什么情况?
第18讲 | 什么情况下Java程序会产生死锁?如何定位、修复?
第19讲 | Java并发包提供了哪些并发工具类?
第20讲 | 并发包中的ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别?
第21讲 | Java并发类库提供的线程池有哪几种? 分别有什么特点?
第22讲 | AtomicInteger底层实现原理是什么?如何在自己的产品代码中应用CAS操作?
第23讲 | 请介绍类加载过程,什么是双亲委派模型?
第24讲 | 有哪些方法可以在运行时动态生成一个Java类?
第25讲 | 谈谈JVM内存区域的划分,哪些区域可能发生OutOfMemoryError?
第26讲 | 如何监控和诊断JVM堆内和堆外内存使用?
第27讲 | Java常见的垃圾收集器有哪些?
第28讲 | 谈谈你的GC调优思路?
第29讲 | Java内存模型中的happen-before是什么?
第30讲 | Java程序运行在Docker等容器环境有哪些新问题?
模块三 Java安全基础 (2讲)
第31讲 | 你了解Java应用开发中的注入攻击吗?
第32讲 | 如何写出安全的Java代码?
模块四 Java性能基础 (3讲)
第33讲 | 后台服务出现明显“变慢”,谈谈你的诊断思路?
第34讲 | 有人说“Lambda能让Java程序慢30倍”,你怎么看?
第35讲 | JVM优化Java代码时都做了什么?
模块5 Java应用开发扩展 (4讲)
第36讲 | 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
第37讲 | 谈谈Spring Bean的生命周期和作用域?
第38讲 | 对比Java标准NIO类库,你知道Netty是如何实现更高性能的吗?
第39讲 | 谈谈常用的分布式ID的设计方案?Snowflake是否受冬令时切换影响?
周末福利 (2讲)
周末福利 | 谈谈我对Java学习和面试的看法
周末福利 | 一份Java工程师必读书单
结束语 (1讲)
结束语 | 技术没有终点
Java核心技术面试精讲
登录|注册

第36讲 | 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?

杨晓峰 2018-07-31
在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一。做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种数据库自身体系结构的理解。今天这一讲,作为补充 Java 面试考察知识点的完整性,关于数据库的应用和细节还需要在实践中深入学习。
今天我要问你的问题是,谈谈 MySQL 支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?

典型回答

所谓隔离级别(Isolation Level),就是在数据库事务中,为保证并发数据读写的正确性而提出的定义,它并不是 MySQL 专有的概念,而是源于ANSI/ISO制定的SQL-92标准。
每种关系型数据库都提供了各自特色的隔离级别实现,虽然在通常的定义中是以锁为实现单元,但实际的实现千差万别。以最常见的 MySQL InnoDB 引擎为例,它是基于 MVCC(Multi-Versioning Concurrency Control)和锁的复合实现,按照隔离程度从低到高,MySQL 事务隔离级别分为四个不同层次:
读未提交(Read uncommitted),就是一个事务能够看到其他事务尚未提交的修改,这是最低的隔离水平,允许脏读出现。
读已提交(Read committed),事务能够看到的数据都是其他事务已经提交的修改,也就是保证不会看到任何中间性状态,当然脏读也不会出现。读已提交仍然是比较低级别的隔离,并不保证再次读取时能够获取同样的数据,也就是允许其他事务并发修改数据,允许不可重复读和幻象读(Phantom Read)出现。
可重复读(Repeatable reads),保证同一个事务中多次读取的数据是一致的,这是 MySQL InnoDB 引擎的默认隔离级别,但是和一些其他数据库实现不同的是,可以简单认为 MySQL 在可重复读级别不会出现幻象读。
串行化(Serializable),并发事务之间是串行化的,通常意味着读取需要获取共享读锁,更新需要获取排他写锁,如果 SQL 使用 WHERE 语句,还会获取区间锁(MySQL 以 GAP 锁形式实现,可重复读级别中默认也会使用),这是最高的隔离级别。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Java核心技术面试精讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(17)

  • lizishushu
    mybatis架构自下而上分为基础支撑层、数据处理层、API接口层这三层。

    基础支撑层,主要是用来做连接管理、事务管理、配置加载、缓存管理等最基础组件,为上层提供最基础的支撑。
    数据处理层,主要是用来做参数映射、sql解析、sql执行、结果映射等处理,可以理解为请求到达,完成一次数据库操作的流程。
    API接口层,主要对外提供API,提供诸如数据的增删改查、获取配置等接口。

    作者回复: 这是比较正式的观点

    2018-07-31
    54
  • 一首歌一种心情一段路
    悲观锁和乐观锁在哪儿用的.......平时写sql没接触过啊

    作者回复: 出去面试千万别这么说

    2018-11-24
    1
    22
  • 任鹏斌
    对于mysql四个隔离级别中的不可重复读的最后一句不是很理解。不可重复读应该是不能避免幻读,为什么说是不产生幻读呢?
    2018-08-12
    1
    8
  • L.B.Q.Y
    mysql(innodb)的可重复读隔离级别下,为什么可以认为不会出现幻像读呢?

    作者回复: 从技术角度实现,mysq用mvcc做了snapshot,如果是locking read文档明确指出了会做区间锁定

    2018-07-31
    1
    7
  • clz1341521
    mysql inndb默认可重复读级别,不会出现幻读。
    mybatis架构自下而上分为基础支撑层、数据处理层、API接口层这三层。

    基础支撑层,主要是用来做连接管理、事务管理、配置加载、缓存管理等最基础组件,为上层提供最基础的支撑。
    数据处理层,主要是用来做参数映射、sql解析、sql执行、结果映射等处理,可以理解为请求到达,完成一次数据库操作的流程。
    API接口层,主要对外提供API,提供诸如数据的增删改查、获取配置等接口。

    作者回复: 不错

    2018-08-11
    6
  • 文彦
    晓峰老师。最近感觉基础有点差,开始看jdk的源码,主要是结合api来看。但是感觉事倍功半,有什么好的建议吗?

    作者回复: 还是明确目的+实践,不一定非要都看jdk源码,初期明白并掌握通用原则更高效,比如 冠宝的 《阿里Java手册》或者经典书籍,并且达到水平还是要有代码量

    2018-11-08
    4
  • 郝国梁
    乐观锁 悲观锁 脏读 幻读 不可重复读 CAS MVCC 隔离级别 锁队列 2PC TCC
    2018-07-31
    4
  • 饭粒
    SQL标准的隔离级别可重复读还是有幻读问题的。 InnoDB 和 XtraDB存储引擎 通过多版本并发控制( MVCC, Multiversion Concurrency Control) 解决了幻读的问题。

    作者回复: 嗯呢

    2019-02-12
    1
    3
  • old_snail
    杨老师 您好,关于“可以简单认为MySQL在可重复读级别不会出现幻象读”没能理解,个人认为正是因为可重复读,即每个事务保存了快照,才导致了幻读的现象。想要解决幻读,只能加共享锁或者排它锁吧。 可能是因为知识浅导致无法理解,还望方便的话,您能点拨一下,感谢
    2018-08-22
    3
  • 三木子
    说到mybatis,就想起了分页,现在绝大多分页都用到了pagehelper插件,我想问下老师为啥mybatis没有设计一个好用的分页了?

    作者回复: 这最好问MyBatis作者,抱歉

    2018-07-31
    1
    3
  • anji
    0.sql工厂-主要设定数据库连接信息
    1.接口层-主要有mapper接口用于对外提供具体的sql执行方法
    2.xml文件-有具体的sql实现语句,以及数据库字段对应java类字段的映射关系,每个mapper对应每个数据库表
    2018-07-31
    3
  • Allen
    请问什么时候可以细说一哈ORM映射😋
    2018-08-01
    2
  • Dream
    MVCC到底有没有加锁?如何应用的?
    2018-08-23
    1
  • 小笨蛋
    sql方面我们从来没有使用过悲观锁,一直都是用的乐观锁,怎么办?
    2019-01-02
  • 种出个地球
    老师是不是写错了,在可重复读隔离级别中,基于锁的并发控制 DBMS实现保持读取和写入锁定(在选定数据上获取),直到事务结束。但是,range-locks没有被管理 ,因此可能会发生幻像读取。

    事物的隔离级别增强分别解决由脏读、不可重复读再到幻读,只有串行化能解决三者,但是损失了效率。

    作者回复: 大家理解的范围可能有些区别,你可以设计一个简单的测试用例并试验一下吗?

    2018-10-22
  • kitten
    mysql,可重复读的隔离级别,也在有gap间隙锁吧?

    作者回复: 是 有,另一个回复里提到了

    2018-08-01
  • 涛哥迷妹
    不同的事务隔离级别分别怎么实现事务机制一样吗
    2018-08-01
收起评论
17
返回
顶部