Java 核心技术面试精讲
杨晓峰
前 Oracle 首席工程师
125942 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
Java 核心技术面试精讲
15
15
1.0x
00:00/00:00
登录|注册

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

主要模块
层次划分
Spring JDBC Template
MyBatis
Hibernate
JDBC
针对高并发场景的解决方案
常见的SQL语句和调优技巧
每种数据库的设计和实现差异
数据库设计基础
避免类似情况的数据库设计手段
设计典型场景重现脏读、幻象读
并发相关的基础概念和实践
数据库内部机制
火车余票查询和购票系统
AtomicFieldUpdater类
SELECT ... FOR UPDATE
串行化
可重复读
读已提交
读未提交
架构设计的角度下的MyBatis
Java和数据库交互技术
数据库相关领域学习
可能的进一步考察
面试考察内容
应用场景
乐观锁
悲观锁
事务隔离级别
一课一练
知识扩展
考点分析
谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景

该思维导图由 AI 生成,仅供参考

在日常开发中,尤其是业务开发,少不了利用 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/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文从数据库开发者的角度,介绍了MySQL的事务隔离级别和锁机制,强调了在面试中可能涉及到的相关问题。文章首先介绍了MySQL的事务隔离级别,包括读未提交、读已提交、可重复读和串行化,以及它们的特点和适用场景。接着详细解释了悲观锁和乐观锁的原理及应用场景,悲观锁通过加锁避免数据冲突,而乐观锁则通过版本判断实现。此外,还提到了MVCC是一种乐观锁机制,而排他性的读写锁则是悲观锁的实现。文章还展示了悲观锁和乐观锁在实际应用中的场景,如火车余票查询和购票系统。除此之外,文章还涉及了数据库应用开发中的应用场景和不同的职责方向,以及与Java开发相关的O/R Mapping框架。总的来说,本文是一份有价值的技术参考资料,对于数据库开发者和面试准备者来说具有重要意义。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 核心技术面试精讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(21)

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

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

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

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

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

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

    2018-11-08
    14
  • clz1341521
    mysql inndb默认可重复读级别,不会出现幻读。 mybatis架构自下而上分为基础支撑层、数据处理层、API接口层这三层。 基础支撑层,主要是用来做连接管理、事务管理、配置加载、缓存管理等最基础组件,为上层提供最基础的支撑。 数据处理层,主要是用来做参数映射、sql解析、sql执行、结果映射等处理,可以理解为请求到达,完成一次数据库操作的流程。 API接口层,主要对外提供API,提供诸如数据的增删改查、获取配置等接口。

    作者回复: 不错

    2018-08-11
    2
    13
  • L.B.Q.Y
    mysql(innodb)的可重复读隔离级别下,为什么可以认为不会出现幻像读呢?

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

    2018-07-31
    2
    12
  • 饭粒
    SQL标准的隔离级别可重复读还是有幻读问题的。 InnoDB 和 XtraDB存储引擎 通过多版本并发控制( MVCC, Multiversion Concurrency Control) 解决了幻读的问题。

    作者回复: 嗯呢

    2019-02-12
    5
    7
  • 李二木
    说到mybatis,就想起了分页,现在绝大多分页都用到了pagehelper插件,我想问下老师为啥mybatis没有设计一个好用的分页了?

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

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

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

    2018-08-01
    1
  • 互联网联络员
    老师是不是写错了,在可重复读隔离级别中,基于锁的并发控制 DBMS实现保持读取和写入锁定(在选定数据上获取),直到事务结束。但是,range-locks没有被管理 ,因此可能会发生幻像读取。 事物的隔离级别增强分别解决由脏读、不可重复读再到幻读,只有串行化能解决三者,但是损失了效率。

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

    2018-10-22
  • 任鹏斌
    对于mysql四个隔离级别中的不可重复读的最后一句不是很理解。不可重复读应该是不能避免幻读,为什么说是不产生幻读呢?
    2018-08-12
    6
    13
收起评论
显示
设置
留言
21
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部