一般是通过锁机制,解决掉不可重复读和幻读的问题。是不是可以通过乐观锁的问题去解决不可重复读和幻读的问题,MySQL 采用的是 MVCC 机制来解决脏读、不可重复读的问题。

MVCC 英文全称是 Muitiversion Concurrency Control,多版本并发控制技术,原理是通过数据行的多个版本管理实现数据库的并发控制,通过保存数据的历史版本,可以通过比较版本号决定数据是否显示,读取数据的时候不需要加锁保证事务的隔离效果。

MVCC 是如何解决脏读的?

MVCC 解决了一致性读问题,当我们读取某个数据库在时间点的快照时,只能看到时间点之前提交更新的结果,不能看到时间点之后事务提交的更新结果。这样就避免了脏读问题。

MVCC 是如何解决不可重复读的?

在说如何解决不可重复读之前,先谈谈 MVCC 的实现原理。

快照读

快照读,读取的是快照数据,一般不加锁的 select 查询都是快照读。

select * from player where ...

当前读

当前读就是读的最新数据,而不是历史数据,加锁的 select,或者对数据进行增删改都会读取当前最新数据。

SELECT * FROM player LOCK IN SHARE MODE;

SELECT FROM player FOR UPDATE;

INSERT INTO player values ...

DELETE FROM player WHERE ...

UPDATE player SET ...

MVCC 是基于 Read View + 活跃事务表实现的。

行记录快照模型

数据表中的一行记录实际上有多个版本,每个版本有自己的事务 ID(row_trx_id)每次需要读取那个版本数据的时候,是通过当前版本,加 Undo Log 中存储的快照链表得到那个版本真实数据。

行记录快照是保存在 Undo Log 中,并且行记录快照是通过链表串联起来,每个快照都保存了 trx_id (事务 ID),如果要找到历史快照,只需要遍历回滚指针进行查找。

Read View

会有这么一个问题:一个事务开启,这个事务要查询数据,需要读取哪个版本的行记录呢?Read View 就是来解决这个问题的,简单的说 Read View 是可以帮助我们解决可见性问题的。

ReadView 中保存了当前活跃的事务列表。通过比较事务版本,可以判断当前行数据版本是不是对当前事务可见。

Read View 模型

如果当前行记录版本是 trx_id < 活跃的最小事务 ID (up_limit_id),说明行记录在这些活跃的事务创建前就已经提交,这个行记录对当前事务是可见的。

如果当前行记录事务版本 trx_id > 活跃的最大事务 ID (low_limit_id) 说明,这个行记录是在事务后创建的,这个行记录对当前事务不可见。

如果 up_limit_id < trx_id < low_limit_id,则有如下情况:

若 row trx_id 在数组 trx_ids 中,表示这个版本是由还没提交的事务生成的,不可见。

若 row trx_id 不在数组 trx_ids 中,表示这个版本是已经提交了的事务生成的,可见。

mysql脏读解决方案_MySQL为什么可以解决脏读和不可重复读?相关推荐

  1. mysql脏读解决方案_mysql是如何解决脏读、不可重复读、幻读?

    刚开始写博客.. 写的太low. 1.数据库的两种读,每种读读的数据版本不一样,所以也称为MVCC,即多版本并发控制 a) 快照读 select * from where xxx  这种形式的都是快照 ...

  2. mysql 1055 解决方案_MySQL报错1055解决方案 - 树懒学堂

    相信大家在使用MySQL数据库的过程中,或多或少都遇到报错.在mysql版本更新到5.7之后,有一个新的报错出现的次数越来越频繁,它就是MySQL 1055 报错. 本文就给大家介绍一下MySQL 1 ...

  3. MySQL数据库中,在读已提交和可重复读这两个不同事务隔离级别下幻读的区别

    目 录 1. 前 言 1.1 并发事务存在的问题 1.2 事务的隔离级别 1.3 快照读和当前读 2. 不同事务隔离级别下幻读的区别 2.1 读已提交下的幻读 2.2 可重复读下的幻读 2.2.1 情 ...

  4. SpringCloud-Gateway自定义过滤器,解决body流不能重复读的问题

    网上的代码千奇百怪,这个是我测试后整理的. 当前端请求不含body时,也能兼容. 1.读取body流进行缓存 /*** 获取body请求数据(解决流不能重复读取问题)* 这个过滤器的order设置的是 ...

  5. mysql dw解决方案_MySQL 的 DW 解决方案(MySQL + Infobright)

    随着 BI (DW) 在各个企业中重要性的不断提升,各个数据库厂家都希望能搭上这辆班车.这不,MySQL 也联合 Infobright 一起推出了开源的 数据仓库解决方案,而且是开源的. 其实现的各种 ...

  6. mysql binary 查询_MYSQL的binary解决mysql数据大小写敏感问题 《转载》

    BINARY不是函数,是类型转换运算符,它用来强制它后面的字符串为一个二进制字符串,可以理解为在字符串比较的时候区分大小写 如下: mysql> select binary 'ABCD'='ab ...

  7. mysql 同步失败_mysql 同步失败解决方法 (错误:1236)

    在重启了外国B的服务器后,发现国内A数据库同步突然停止了,导致国内A服务器复制失败,如下: 国内A就报下面的错误: 090910 22:47:18 [ERROR] Error reading pack ...

  8. mysql myisam 并发_MySQL的myisam解决并发读写解决方法

    MySQL的myisam解决并发读写解决方法MyISAM在读操作占主导的情况下是很高效的.可一旦出现大量的读写并发,同InnoDB相比,MyISAM的效率就会直线下降,而且,MyISAM和InnoDB ...

  9. mysql 10055 解决方案_MySQL提示 Can't connect to MySQL server on'localhost' (10055) 解决方案...

    问题主要出现在Windows环境中,主要原因是应用程序频繁的连接访问数据库,而系统会为每个连接动态分配一个端口,Windows Server 2008 R2默认可供动态分配使用的端口只有16383 ( ...

最新文章

  1. php脚本函数,PHP执行系统命令函数实例讲解
  2. 网易易盾验证码移动端迎来新版本 开始支持智能无感知验证
  3. php写简单接口_使用PHP如何编写简单的App接口
  4. mysql问题处理积累
  5. Python异常:TypeError: a bytes-like object is required, not 'str'
  6. C++ float、double判断是否等于0
  7. java hostnameverifier_关于HostnameVerifier接口的解读
  8. Beetle简单构建TCP服务
  9. 轨道客流预测TransCAD公交分配结果详解
  10. win8网速怎么测试软件,Win10怎么测试网速 Win10在线测试网速方法
  11. Feign的工作原理
  12. brctl配置linux bridge及虚拟bridge实现
  13. pvs-stdio ue4_PlatformIO中的PVS-Studio集成
  14. 《IT项目经理成长手记》读后有所思
  15. C#与PLC通信开发之三菱FX系列PLC
  16. Varscan2 Call snp_indel
  17. Yolov5检测并生成文本及标签文件
  18. 在C#中使用OpenCV(使用OpenCVSharp)
  19. html加入3d模型的,3dmax怎么给模型添加材质
  20. USB WDM驱动开发实例 bulkusb

热门文章

  1. k203m机型java游戏_唯美中国风 品步步高K203M的江南之美
  2. 实现同网段不同vlan通信有几种方式?纯二层网络下又是如何实现的?
  3. Ubuntu16.04中鼠标左右键功能相反
  4. LAB002 -Oracle数据库手工冷备份(归档模式)
  5. VS2015 打包应用程序“系统必备”
  6. HDU 4735 舞蹈链可重复覆盖
  7. iPad3/iPad2/iPad 5.1.1完美越狱WIN版详细教程
  8. 使用adb命令将手机和至电脑上的文件互传
  9. 有刷直流电机的工作原理及控制电路
  10. 尖刀出鞘的display常用属性及css盒模型深入研究