目录

幻读原因

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 的三种行锁

  1. 记录锁:针对单个行记录添加锁。
  2. 间隙锁(Gap Locking):可以帮我们锁住一个范围(索引之间的空隙),但不包括记录本身。采用间隙锁的方式可以防止幻读情况的产生。
  3. 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引擎是如何解决幻读的?相关推荐

  1. 【MySQL系列5】深入分析MySQL中锁并详解锁解决幻读问题

    MySQL锁分析 MySQL系列文章汇总 前言 什么是锁 锁的分类 全局锁 表锁 行锁 共享锁 排他锁 意向锁 各种锁的兼容关系 锁到底锁的是什么 举例猜测 结论 行锁的算法 记录锁(Record L ...

  2. MySQL可重复读级别能够解决幻读吗

    引言 之前在深入了解数据库理论的时候,了解到事物的不同隔离级别可能存在的问题.为了更好的理解所以在MySQL数据库中测试复现这些问题.关于脏读和不可重复读在相应的隔离级别下都很容易的复现了.但是对于幻 ...

  3. InnoDB的MVCC如何解决幻读

    2019独角兽企业重金招聘Python工程师标准>>> InnoDB默认的隔离级别是RR(可重复读),可以解决脏读和不可重复读,但是不能解决幻读问题. 什么是幻读? 事务A读取了一个 ...

  4. mysql的mvcc如何解决幻读_MySQL InnoDB MVCC 能否完全解决幻读?

    幻读是指多事务并发中一个事务读到了另一个事务insert的记录. 在REPEATABLE READ隔离级别下,假设事务T1执行后,事务T2开始执行,并新增一条记录,然后事务T2提交,这时在事务T1中执 ...

  5. MySQL是如何解决幻读

    前言 事务的隔离级别有四种,读未提交,读已提交,可重复读和串行化,下面结合具体的问题,在mysql中innodb引擎是怎么解决幻读的? 一.相关问题 1.什么是幻读 幻读:一次事务里,多次查询后,结果 ...

  6. InnoDB解决幻读的方案--LBCCMVCC

    最近要在公司内做一次技术分享,思来想去不知道该分享些什么,最后在朋友的提示下,准备分享一下MySQL的InnoDB引擎下的事务幻读问题与解决方案--LBCC&MVCC.经过好几天的熬夜通宵,终 ...

  7. 关于数据库隔离级别为RR(可重复读)下是否解决幻读问题

    一.数据库隔离级别 隔离级别 脏读可能性 不可重复读可能性 幻读可能性 加锁读 READ UNCOMMITTED 是 是 是 否 READ COMMITTED 否 是 是 否 REPEATABLE R ...

  8. oracle、mysql、sqlserver的对比数据库引擎的对比与选型InnoDB解决幻读

    1. 所属公司: MySQL是由瑞典MySQL AB公司开发,目前属于 Oracle 旗下产品: Oracle是由美国ORACLE公司(甲骨文)开发的一组核心软件产品: SqlServer是由Micr ...

  9. 巧用MySQL InnoDB引擎锁机制解决死锁问题

    案例如下: 在使用Show innodb status检查引擎状态时,发现了死锁问题: *** (1) TRANSACTION: TRANSACTION 0 677833455, ACTIVE 0 s ...

最新文章

  1. Oracle误删除数据的恢复方法
  2. android permission 访问权限大全
  3. 在计算机技术中描述信息最小单位是,计算机二级考试单选题
  4. List Set Map的区别
  5. 有上下界网络流问题汇总
  6. 《编码规范和测试方法——C/C++版》作业 ·007——C++引入MySQL给C的API并简单封装
  7. android 的几个黄色警告解决办法(转)
  8. 浅谈微服务下异常处理
  9. PHP复习第三天-文件上传
  10. 数字图像处理—图像纹理特征
  11. 更新git 分支代码到最新
  12. [GIS热点] 3S技术集成-新技术革命下集成模式
  13. 聚类生成anchor框的尺寸和比例
  14. iOS 高德地图开发详解
  15. type在python是什么意思_python中type()是什么意思
  16. 如何在Guitar Pro上添加吉他和弦
  17. MT4-EA自动化交易研究笔记(2022-06-24)
  18. android 8 奕骆,为耐而生的手机 Innos奕骆D6000评测
  19. 数据库原理与应用 构建音乐商店,实现复杂查询和批量操作及视图练习
  20. 关于Android安卓APP保活 - 安卓消息推送详解 - 安卓端外推送离线推送

热门文章

  1. %time与%timeit
  2. ts 实现 抓娃娃 状态机
  3. ubuntu 12.04安装截图功能的软件 gimp
  4. 如何用 Python 画出 69 岁老同志?
  5. vue history 微信jssdk授权失败解决办法
  6. oracle数据块损坏后的修复方法
  7. 神经网络学习(二)Tensorflow-简单神经网络(全连接层神经网络)实现手写字体识别
  8. DNS/ICMP协议/NAT技术
  9. 【Try to Hack】fiddler
  10. usb延长线线序_我应该使用哪种延长线?