摘要:Read Committed,事务运行期间,只要别的事务修改数据并提交,即可读到人家修改的数据,所以会有不可重复读、幻读问题。

本文分享自华为云社区《MySQL RC事务隔离级别的实现》,作者: JavaEdge 。

Read Committed,事务运行期间,只要别的事务修改数据并提交,即可读到人家修改的数据,所以会有不可重复读、幻读问题。

ReadView机制基于undo log版本链条实现的一套读视图机制,事务生成一个ReadView:

  • 若为事务自己更新的数据,自己可以读到
  • 或在你生成ReadView之前提交的事务所修改的值,也可读到
  • 但若你生成ReadView时,就已经活跃的事务,但如果它在你生成ReadView之后修改的数据并提交了,此时你读不到
  • 或你生成ReadView以后再开启的事务修改了数据,还提交了,也读不到

所以上面那套机制就是ReadView的一个原理如何基于ReadView实现RC?核心设计:当一个事务设置RC,他是每次发起查询,都重新生成一个ReadView!

数据库里有一行数据,是事务id=50的一个事务,很久以前就插入的,当前活跃事务:

  • 事务A(id=60)
  • 事务B(id=70)

现在事务B发起update,更新这条数据为b,所以此时数据的trx_id会变为事务B的id=70,同时生成一条undo log:

这时,事务A要发起一次查询操作,就会生成一个ReadView

这时事务A发起查询,发现当前这条数据的trx_id=70。即属于ReadView的事务id范围之间,说明是他生成ReadView之前就有这个活跃的事务,是这个事务修改了这条数据的值,但此时事务B还没提交,所以ReadView的m_ids活跃事务列表里,有[60, 70]两个id,此时根据ReadView机制,事务A无法查到事务B修改的值b。

接着就顺着undo log版本链条往下查找,就会找到一个原始值,发现其trx_id是50,小于当前ReadView里的min_trx_id,说明是他生成ReadView之前,就有一个事务插入了这个值并且早就提交了,因此可以查到这个原始值。

接着,假设事务B提交,提交了就说明事务B不会活跃于数据库里了。事务A下次再查询,就可以读到事务B修改过的值了。那到底是怎么让事务A能够读到提交的事务B修改过的值呢?

让事务A下次发起查询,再生成一个ReadView,数据库内活跃的事务只有事务A,因此:

  • min_trx_id是60
  • mac_trx_id是71
  • m_ids=60,事务B的id=70不会出现在m_ids活跃事务列表

此时事务A再次基于这个ReadView去查询,会发现这条数据的trx_id=70,虽然在ReadView的min_trx_id和max_trx_id范围之间,但是此时并不在m_ids列表内,说明事务B在生成本次ReadView之前就已提交。说明这次你查询就可以查到事务B修改过的这个值了, 此时事务A就会查到值B。

点击关注,第一时间了解华为云新鲜技术~

MySQL 是如何实现RC事务隔离级别的相关推荐

  1. 自语之Mysql隐式提交和事务隔离级别的关系

    前言 笔者自诩对Mysql的知识积累已经很不错了,现在看来不过是对CRUD操作比较熟悉罢了. 用了那么久的Mysql, 直到前几日才知道隐式提交和事务隔离级别的联系(内幕). (想自学习编程的小伙伴请 ...

  2. MySQL数据库中默认事务隔离级别是?

    MySQL数据库中默认事务隔离级别是? 事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到 ...

  3. mysql事务四个安全级别_四个MySQL事务隔离级别的详细说明

    本文中的实验测试环境: Windows 10 + cmd + MySQL5.6.36 + InnoDB 首先,交易的基本要素(ACID) 1. 原子性: 事务开始后 2. 一致性(Consistenc ...

  4. mysql查看数据库事务隔离级别_MySQL查看和修改事务隔离级别的实例讲解

    查看事务隔离级别 在 MySQL 中,可以通过show variables like '%tx_isolation%'或select @@tx_isolation;语句来查看当前事务隔离级别. 查看当 ...

  5. mysql的默认隔离级别_mysql默认事务隔离级别是什么?

    mysql数据库事务的隔离级别有4个,而默认的事务处理级别就是[REPEATABLE-READ],也就是可重复读.下面本篇文章就来带大家了解一下mysql的这4种事务的隔离级别,希望对大家有所帮助. ...

  6. mysql事务隔离级别的研究

    四种隔离级别概述 1.未提交读(read-uncommitted) 在一个事务中,可以读取到其他事务未提交的数据变化,这种读取其他会话还没提交的事务,叫做脏读现象,在生产环境中切勿使用. 2.已提交读 ...

  7. mysql数据库事务隔离级别的查看、设置、以及隔离级别有效范围的设置

    0.准备 事务隔离级别如下: Read-Uncommitted Read-Committed Repeatable-Read Seriaizable 在xhsell开启三个会话( 注意:这里的xshe ...

  8. mysql与spring隔离级别不同_mysql事务隔离级别与spring事务隔离级别的区别

    mysql事务隔离级别与spring事务隔离级别的区别: 脏读:为什么会出现脏读,因为你对数据库的任何修改都会是立即生效的,至于别人能不能看到主要取决与你 是否加锁了,数据库的执行与事务没有关系,事务 ...

  9. MySQL事务隔离级别是怎么实现的?

    我的钱包里共有100万. 今天我心情好,我决定给你的转账 100 万,最后的结果肯定是我的余额变为 0 元,你的余额多了 100 万元,是不是想到就很开心? 转账这一动作在程序里会涉及到一系列的操作, ...

最新文章

  1. 安装计算机过程中的注意事项,西门子step7安装过程中的注意事项
  2. gradle使用技巧之全局变量
  3. ES6新特性之函数优化-箭头函数
  4. Type TIMESTAMP(3) of table field ‘onSellTime‘ does not match with the physical type TIMESTAMP(6)
  5. NgRx store.dispatch方法的单步调试
  6. 获取 Web 设计的免费资源
  7. 英语笔记:写作:Recreational activities
  8. GitHub 公布了托管平台与美国贸易管制的相关细节
  9. 谷歌漏洞披露规则增加30天补丁缓冲期;Reddit 公开漏洞奖励计划
  10. Linux命令之awk:高级输入输出(四)
  11. mysql 索引 数据页_数据库索引数据页
  12. Linux C多线程编程
  13. 解决:Win10 程序切换/系统提示弹窗不在顶层
  14. 【kubernetes】k8s的job和cronjob详细说明【job、cronjob(cj)、descheduler(pod均衡)】
  15. 爬取校花图片保存到本地文件夹下(requests+re)
  16. XPDL学习与分享 一
  17. ZY Player 2.3.5 中文版 (全网视频播放器)
  18. MySQL5.6建索引时遇到 Specified key was too long; max key length is 767 bytes错误提示解决办法
  19. 04以太坊测试网(Testnets)
  20. 通信系统的组成(精简介绍)

热门文章

  1. Hackerlands:城市Hackerspaces的农村版本
  2. (10)Node.js核心模块—fs文件系统之目录操作
  3. HTML5 本地存储 Web Storage
  4. HTML label控件
  5. Bootstrap 滚动监听插件Scrollspy 的方法
  6. es6 Generator.prototype.throw()方法
  7. sqlite3存储与读写
  8. CAN笔记(21) 服务数据对象
  9. 计算机编程常用指令,加工中心几个常用指令的编程技巧
  10. 微信坐标转换百度坐标