MySQL的InnoDB引擎是如何解决幻读的?
目录
幻读原因
InnoDB 的三种行锁
InnoDB 的解决方案
总结
面试题
在 MySQL 中,默认的隔离级别是可重复读,可以解决脏读和不可重复读的问题,只要提升隔离级别到串行化即可解决幻读问题。
本文结束!
串行化的隔离级别使数据库无法并发,那么,实际情况是如何解决幻读问题的呢?
幻读原因
在MVCC一文中,我们了解到数据库的MVCC机制,当隔离级别为读已提交(Read Commit)时一个事务中的每一次 SELECT 查询都会获取一次 Read View,如果 Read View 不同,就可能产生不可重复读或者幻读的情况:
事务 | 说明 |
---|---|
BEGIN; | |
SELECT... | 获取Read View |
................. | |
SELECT... | 获取Read View |
COMMIT; |
隔离级别为可重复读的时候,就避免了不可重复读,因为一个事务只在第一次 SELECT 的时候会获取一次 Read View,而后面所有的 SELECT 都会复用这个 Read View。
InnoDB 的三种行锁
- 记录锁:针对单个行记录添加锁。
- 间隙锁(Gap Locking):可以帮我们锁住一个范围(索引之间的空隙),但不包括记录本身。采用间隙锁的方式可以防止幻读情况的产生。
- Next-Key 锁:帮我们锁住一个范围,同时锁定记录本身,相当于间隙锁 + 记录锁,可以解决幻读的问题。
出现幻读的原因是在读已提交的情况下,InnoDB 只采用记录锁(Record Locking)!
InnoDB 的解决方案
实际上,还是将锁的范围扩大到 间隙锁 + 记录锁 来解决幻读问题的。
在隔离级别为可重复读时,InnoDB 会采用 Next-Key 锁的机制,解决幻读问题。
总结
MySQL8以上版本默认隔离级别就是可重复读,是不存在事务问题的。
但是在高并发环境下可以手动降低隔离级别提高并发性。
面试题
T1 select 之后 update,会将 T2 中 insert 的数据一起更新,那么认为多出来一行,所以防不住幻读,对吗?
答案:
错误,InnoDB 中设置了快照读和当前读两种模式,如果只有快照读,那么自然没有幻读问题,但是如果将语句提升到当前读,那么 T1 在 select 的时候需要用如下语法: select * from t for update (lock in share mode) 进入当前读,那么自然没有 T2 可以插入数据这一回事儿了
参考:https://blog.csdn.net/mrs_chens/article/details/90644868
MySQL的InnoDB引擎是如何解决幻读的?相关推荐
- 【MySQL系列5】深入分析MySQL中锁并详解锁解决幻读问题
MySQL锁分析 MySQL系列文章汇总 前言 什么是锁 锁的分类 全局锁 表锁 行锁 共享锁 排他锁 意向锁 各种锁的兼容关系 锁到底锁的是什么 举例猜测 结论 行锁的算法 记录锁(Record L ...
- MySQL可重复读级别能够解决幻读吗
引言 之前在深入了解数据库理论的时候,了解到事物的不同隔离级别可能存在的问题.为了更好的理解所以在MySQL数据库中测试复现这些问题.关于脏读和不可重复读在相应的隔离级别下都很容易的复现了.但是对于幻 ...
- InnoDB的MVCC如何解决幻读
2019独角兽企业重金招聘Python工程师标准>>> InnoDB默认的隔离级别是RR(可重复读),可以解决脏读和不可重复读,但是不能解决幻读问题. 什么是幻读? 事务A读取了一个 ...
- mysql的mvcc如何解决幻读_MySQL InnoDB MVCC 能否完全解决幻读?
幻读是指多事务并发中一个事务读到了另一个事务insert的记录. 在REPEATABLE READ隔离级别下,假设事务T1执行后,事务T2开始执行,并新增一条记录,然后事务T2提交,这时在事务T1中执 ...
- MySQL是如何解决幻读
前言 事务的隔离级别有四种,读未提交,读已提交,可重复读和串行化,下面结合具体的问题,在mysql中innodb引擎是怎么解决幻读的? 一.相关问题 1.什么是幻读 幻读:一次事务里,多次查询后,结果 ...
- InnoDB解决幻读的方案--LBCCMVCC
最近要在公司内做一次技术分享,思来想去不知道该分享些什么,最后在朋友的提示下,准备分享一下MySQL的InnoDB引擎下的事务幻读问题与解决方案--LBCC&MVCC.经过好几天的熬夜通宵,终 ...
- 关于数据库隔离级别为RR(可重复读)下是否解决幻读问题
一.数据库隔离级别 隔离级别 脏读可能性 不可重复读可能性 幻读可能性 加锁读 READ UNCOMMITTED 是 是 是 否 READ COMMITTED 否 是 是 否 REPEATABLE R ...
- oracle、mysql、sqlserver的对比数据库引擎的对比与选型InnoDB解决幻读
1. 所属公司: MySQL是由瑞典MySQL AB公司开发,目前属于 Oracle 旗下产品: Oracle是由美国ORACLE公司(甲骨文)开发的一组核心软件产品: SqlServer是由Micr ...
- 巧用MySQL InnoDB引擎锁机制解决死锁问题
案例如下: 在使用Show innodb status检查引擎状态时,发现了死锁问题: *** (1) TRANSACTION: TRANSACTION 0 677833455, ACTIVE 0 s ...
最新文章
- Oracle误删除数据的恢复方法
- android permission 访问权限大全
- 在计算机技术中描述信息最小单位是,计算机二级考试单选题
- List Set Map的区别
- 有上下界网络流问题汇总
- 《编码规范和测试方法——C/C++版》作业 ·007——C++引入MySQL给C的API并简单封装
- android 的几个黄色警告解决办法(转)
- 浅谈微服务下异常处理
- PHP复习第三天-文件上传
- 数字图像处理—图像纹理特征
- 更新git 分支代码到最新
- [GIS热点] 3S技术集成-新技术革命下集成模式
- 聚类生成anchor框的尺寸和比例
- iOS 高德地图开发详解
- type在python是什么意思_python中type()是什么意思
- 如何在Guitar Pro上添加吉他和弦
- MT4-EA自动化交易研究笔记(2022-06-24)
- android 8 奕骆,为耐而生的手机 Innos奕骆D6000评测
- 数据库原理与应用 构建音乐商店,实现复杂查询和批量操作及视图练习
- 关于Android安卓APP保活 - 安卓消息推送详解 - 安卓端外推送离线推送