当前位置: 首页 > news >正文

mysql current read_浅谈MySQL之 REPEATABLE-READ.

在MySQL的引擎Innodb中,默认的transaction isolation即为REPEATABLE-READ。

下面,从非纯技术角度,结合各种参考资料,分析一下REPEATABLE-READ的实现原理。

#1 知识准备。

##1.1  snapshot read

##2.2 current read

##3.3 MVVC(多版本并发控制)

##4.4 next-key。

#2 REPEATABLE-READ 实现效果(解决丢失更新,可重复读)。

##2.1 略。(网络中有详细的效果截图,自己也可以开多个seesion窗口实验,不再赘述。)

#3 基于上述文章的补充(翻译:以上搬砖,以下.....额,只能说当时上学课堂流的口水,现在流的是眼泪,谨以此文,致歉我那上学时滔滔不绝的数据库老教授)。

#3.1 关于snapshot read的补充。

在上述文章中,提到读加共享锁,写加排他锁能够避免不做事务的并发控制而出现的四种问题(参考:数据库隔离级别),但是为了减少锁的使用,提高读的并发能力,基于MVCC的思想,设计出读快照的方法。但是有些涉及到底层数据库实现。

关键是解决:如何确定某行记录对一个活跃的事务是否可见(是否能被当前事务select出来)。

在MySQL的每一行中,末尾存在三个隐藏的字段(到底是几个,有说两个的,这个说两个的后来被人称为是害人不浅,蒙蔽了真理。。。。网上也是众说纷纭,稍有不慎就会迷失,但是基于那个两个隐藏字段的理论确实不能解释出现的现象,因此这个大牛说的是我本篇文章所认同的观点:看这里,比我写的好多了)。

在上述链接文章中,关于read veiw的解释让人茅塞顿开,一切现象得以解释,因此可以基本认定是正确的。在此不再赘述。

#3.2 关于可重复读的意外。

在美团的那篇文章中,提到MySQL本身在REPEATABLE-READ级别就可以防止幻读,我做了实验,但是会出现意外,如以下截图。

35526e52d430

MySQL在REPEATABLE-READ级别出现幻读

有人解释说是因为update操作是实时读,所以更新了select,但是这种解释太粗了,我认为是更新了read view(未求证),因为MySQL的read commit的原理就是每次读都更新read view。

#3.3 实践指导思考。

###3.3.1 索引。

因为写的时候会加排他锁,所以,在写的时候,能做到细粒度的锁住最小的数据单元是很重要的,因此,添加合适并且适当的索引,避免间隙锁,更要避免锁表,是在设计数据库和实际操作表中必须要考虑的。

###3.3.2 避免长时间事务所可重复读带来的数据不准确的问题。

未完待续......

相关文章:

  • mysql 索引pk_细说mysql索引
  • mysql 6.0 jar_maven搭建ssm框架是使用最新mysql 6.0jar遇到的问题
  • rhel7最小化安装 mysql_安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(二)
  • 链接索引 mysql_mysql索引
  • linux c epoll mysql_epoll简介和使用
  • python可以不对变量初始化_Python的诡异陷阱
  • python怎么绘制图例_用Python绘制图例
  • centos7安装mysql5.7.23_centos7.1上安装Mysql5.7.23
  • java客户端_大家都是怎么发布Java客户端程序的?难道让用户自己装JRE?
  • java 加载jar_java – 在运行时加载jar
  • java ant linux_linux下ant的安装
  • java获取数据库信息_java获取数据库的库、表、字段信息
  • java jpanel 布局管理器,JPanel和Java布局管理器
  • java 验证码识别 类库_iCaptcha
  • java调用wsdl证书错误_java调用.net web service服务,报证书错误
  • 2018一半小结一波
  • HTML-表单
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JavaScript中的对象个人分享
  • JavaWeb(学习笔记二)
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • miaov-React 最佳入门
  • MYSQL 的 IF 函数
  • vue-router 实现分析
  • vue脚手架vue-cli
  • vue数据传递--我有特殊的实现技巧
  • Zepto.js源码学习之二
  • 从输入URL到页面加载发生了什么
  • 构建二叉树进行数值数组的去重及优化
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 设计模式走一遍---观察者模式
  • 数据结构java版之冒泡排序及优化
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 白色的风信子
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​用户画像从0到100的构建思路
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (1)(1.13) SiK无线电高级配置(六)
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (4)logging(日志模块)
  • (二)斐波那契Fabonacci函数
  • (理论篇)httpmoudle和httphandler一览
  • (三)docker:Dockerfile构建容器运行jar包
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)重识new
  • ****Linux下Mysql的安装和配置
  • .net 4.0发布后不能正常显示图片问题
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .net 无限分类
  • .NET 中创建支持集合初始化器的类型
  • .NET中的Exception处理(C#)
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解