没有合适的资源?快使用搜索试试~ 我知道了~
首页36谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
资源详情
资源评论
资源推荐

极客时间
第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
锁形式实现,可重复读级别中默认也会使用),这是最高的隔离级别。
至于悲观锁和乐观锁,也并不是
MySQL
或者数据库中独有的概念,而是并发编程的基本概念。主要区别在于,操作共享数据时,
“
悲观锁
”
即认为数据出现冲突的可能性更大,而
“
乐
观锁
”
则是认为大部分情况不会出现冲突,进而决定是否采取排他性措施。
反映到
MySQL
数据库应用开发中,悲观锁一般就是利用类似
SELECT … FOR UPDATE
这样的语句,对数据加锁,避免其他事务意外修改数据。乐观锁则与
Java
并发包中
的
AtomicFieldUpdater
类似,也是利用
CAS
机制,并不会对数据加锁,而是通过对比数据的时间戳或者版本号,来实现乐观锁需要的版本判断。
我认为前面提到的
MVCC
,其本质就可以看作是种乐观锁机制,而排他性的读写锁、双阶段锁等则是悲观锁的实现。
有关它们的应用场景,你可以构建一下简化的火车余票查询和购票系统。同时查询的人可能很多,虽然具体座位票只能是卖给一个人,但余票可能很多,而且也并不能预测哪个查询
者会购票,这个时候就更适合用乐观锁。
考点分析
今天的问题来源于实际面试,这两部分问题反映了面试官试图考察面试者在日常应用开发中,是否学习或者思考过数据库内部的机制,是否了解并发相关的基础概念和实践。
我从普通数据库应用开发者的角度,提供了一个相对简化的答案,面试官很有可能进一步从实例的角度展开,例如设计一个典型场景重现脏读、幻象读,或者从数据库设计的角度,
可以用哪些手段避免类似情况。我建议你在准备面试时,可以在典型的数据库上试验一下,验证自己的观点。
其他可以考察的点也有很多,在准备这个问题时你也可以对比
Java
语言的并发机制,进行深入理解,例如,随着隔离级别从低到高,竞争性(
Contention
)逐渐增强,随之而来的
代价同样是性能和扩展性的下降。
数据库衍生出很多不同的职责方向:
数据库管理员(DBA),这是一个单独的专业领域。
数据库应用工程师,很多业务开发者就是这种定位,综合利用数据库和其他编程语言等技能,开发业务应用。
数据库工程师,更加侧重于开发数据库、数据库中间件等基础软件。
第
36
讲
|
谈谈
MySQL
支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
杨晓峰
- 00:06 / 09:24
















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0