第36讲 | 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
杨晓峰
该思维导图由 AI 生成,仅供参考
在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一。做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种数据库自身体系结构的理解。今天这一讲,作为补充 Java 面试考察知识点的完整性,关于数据库的应用和细节还需要在实践中深入学习。
今天我要问你的问题是,谈谈 MySQL 支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
典型回答
每种关系型数据库都提供了各自特色的隔离级别实现,虽然在通常的定义中是以锁为实现单元,但实际的实现千差万别。以最常见的 MySQL InnoDB 引擎为例,它是基于 MVCC(Multi-Versioning Concurrency Control)和锁的复合实现,按照隔离程度从低到高,MySQL 事务隔离级别分为四个不同层次:
读已提交(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
《Java 核心技术面试精讲》,新⼈⾸单¥59
立即购买
登录 后留言
全部留言(21)
- 最新
- 精选
- lizishushumybatis架构自下而上分为基础支撑层、数据处理层、API接口层这三层。 基础支撑层,主要是用来做连接管理、事务管理、配置加载、缓存管理等最基础组件,为上层提供最基础的支撑。 数据处理层,主要是用来做参数映射、sql解析、sql执行、结果映射等处理,可以理解为请求到达,完成一次数据库操作的流程。 API接口层,主要对外提供API,提供诸如数据的增删改查、获取配置等接口。
作者回复: 这是比较正式的观点
2018-07-312110 - 一首歌一种心情一段路悲观锁和乐观锁在哪儿用的.......平时写sql没接触过啊
作者回复: 出去面试千万别这么说
2018-11-24952 - 文彦晓峰老师。最近感觉基础有点差,开始看jdk的源码,主要是结合api来看。但是感觉事倍功半,有什么好的建议吗?
作者回复: 还是明确目的+实践,不一定非要都看jdk源码,初期明白并掌握通用原则更高效,比如 冠宝的 《阿里Java手册》或者经典书籍,并且达到水平还是要有代码量
2018-11-0814 - clz1341521mysql inndb默认可重复读级别,不会出现幻读。 mybatis架构自下而上分为基础支撑层、数据处理层、API接口层这三层。 基础支撑层,主要是用来做连接管理、事务管理、配置加载、缓存管理等最基础组件,为上层提供最基础的支撑。 数据处理层,主要是用来做参数映射、sql解析、sql执行、结果映射等处理,可以理解为请求到达,完成一次数据库操作的流程。 API接口层,主要对外提供API,提供诸如数据的增删改查、获取配置等接口。
作者回复: 不错
2018-08-11213 - L.B.Q.Ymysql(innodb)的可重复读隔离级别下,为什么可以认为不会出现幻像读呢?
作者回复: 从技术角度实现,mysq用mvcc做了snapshot,如果是locking read文档明确指出了会做区间锁定
2018-07-31212 - 饭粒SQL标准的隔离级别可重复读还是有幻读问题的。 InnoDB 和 XtraDB存储引擎 通过多版本并发控制( MVCC, Multiversion Concurrency Control) 解决了幻读的问题。
作者回复: 嗯呢
2019-02-1257 - 李二木说到mybatis,就想起了分页,现在绝大多分页都用到了pagehelper插件,我想问下老师为啥mybatis没有设计一个好用的分页了?
作者回复: 这最好问MyBatis作者,抱歉
2018-07-3125 - kittenmysql,可重复读的隔离级别,也在有gap间隙锁吧?
作者回复: 是 有,另一个回复里提到了
2018-08-011 - 互联网联络员老师是不是写错了,在可重复读隔离级别中,基于锁的并发控制 DBMS实现保持读取和写入锁定(在选定数据上获取),直到事务结束。但是,range-locks没有被管理 ,因此可能会发生幻像读取。 事物的隔离级别增强分别解决由脏读、不可重复读再到幻读,只有串行化能解决三者,但是损失了效率。
作者回复: 大家理解的范围可能有些区别,你可以设计一个简单的测试用例并试验一下吗?
2018-10-22 - 任鹏斌对于mysql四个隔离级别中的不可重复读的最后一句不是很理解。不可重复读应该是不能避免幻读,为什么说是不产生幻读呢?2018-08-12613
收起评论