mysql 为什么很多互联网公司选择了读可提交

news/2025/3/18 1:37:47/文章来源:https://www.cnblogs.com/aoximin/p/18342380

前言

在默认环境下,mysql 是可重复读,为什么默认可重复读呢?

一般情况下感觉读可提交就行,可重复读解决幻读的问题,但是大多情况下没有幻读的问题,所以也没有必要可重复读。

那么为什么mysql 要把默认配置设置为可重复读呢?

正文

历史原因:

这种图,如果是在可提交读的情况下,会发生什么呢?

当运行完后,那么进行查询:

那么在从库运行,那么就是:

为什么会这样呢?因为binlog 记录的是提交顺序:首先session B 先提交的,那么从库运行的时候就会出现sessionB的语句再运行sessionA的语句。

这样就造成了主从数据不一致的问题。

那么这个问题是否能解决呢?如果这个问题不解决,那么可提交读这个是否就没法做主从了。

这就不得不提及一下binary log,简称bin log了。

现在bin log 有三种格式:

  1. statement

  2. row

  3. mixed

  4. Statement-based replication (SBR): 在SBR中,MySQL服务器将每个执行的SQL语句记录到binlog中。当从主服务器复制到从服务器时,从服务器会执行相同的SQL语句来保持数据同步。这种方法简单且高效,但可能会导致一些复制不一致的问题。

  5. Row-based replication (RBR): 在RBR中,MySQL服务器将每次数据更改的行的副本记录到binlog中。当从主服务器复制到从服务器时,从服务器会根据这些行的副本来进行相同的数据更改。这种方法可以确保数据一致性,但会增加binlog的大小。

  6. Mixed-based replication (MBR): MBR结合了SBR和RBR的优点。MySQL服务器根据情况选择使用SBR或RBR来记录binlog。通常对于不同类型的SQL语句会采用不同的复制方式,以达到效率和数据一致性的平衡。

之所以产生问题呢? 那么就是由于第一种,因为保存的是sql 语句,那么执行的就是sql语句了,顺序不同,那么结果就不同了。

那么要解决这个问题呢? 可以使用row这种模式,这种模式就是将数据的结果写下来,那么同步过去也就是从新同步数据了,也就是同步结果,这个时候就没有问题。

那么这个时候应该也是有更多的开销的,因为row要把结果记录下了,那么肯定是需要更多的磁盘io和磁盘空间了。

但是互联网公司依然选择读提交的原因是什么呢?

  1. 原因一就是间隙锁的问题,因为存在间隙锁,那么死锁概率就大,同样的间隙锁的原因,锁的范围就大了。

  2. 再rr隔离级别下面,没有命中的索引会锁表:

update test set color = 'blue' where color = 'white'; 

试想一下update 要避免color = 'white' 被插入,这个时候只能锁表了。

而读提交,那么就只会锁住两行:

主要的原因是因为读提交的锁范围,并发高,然后需要可重复读场景中的解决幻读问题的比较少。

下一节mvcc。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/777944.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day2-admin管理后台

admin管理后台 1.基于django初始化一个项目 1.conda activate 虚拟名字#进入虚拟环境 2.django-admin startproject blog#创建一个项目blog 3.cd blog #进入blog项目文件夹中 4.python manage.py startapp app的名字#创建一个app初始化数据库(django自带的sqlite)1.python ma…

1-初始前端基本标签

目录初始html –超文本标记语言1.超文本:2.标记语言:3.标签4.html基本框架5.拓展插件6.文字标签7.转义字符8.语义化与SEO 初始html –超文本标记语言 1.超文本:比普通的文本更厉害。可以插入图片/音乐/视频/超链接,对立面的内容进行排版,样式设计2.标记语言:可以吧html当做…

WIN10使用记录

一、win10任务栏任务缩略图变列表 运行中输入regedit,打开注册表编辑器。HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Taskband在右侧窗口中找到NumThumbnails,如果没有的话也要手工新建一个Dword(32位)值,把其命名为NumThumbnails, 双击NumT…

「Day 1—递归问题」

递归问题 定义 简洁来说就是一个函数不断调用自身的一个过程。 习题 汉诺塔问题 思路 对于这个经典的问题,我们考虑了使用递归的做法,由于盘子是在三个底座上来回辗转的,所以我们要确定起始座,辅助座,和目标座。我们专注于最下面的最大的那个盘子,先将盘子都放到辅助座上…

集合类关系

每天坚持,终会抵达!

人工智能的虚拟世界:源码和制作方法

源码和制作方法:人工智能的三维虚拟世界,完全免费、完全开源、完整无缺,一步步教你怎么制作这个游戏。8月4日修复学校场景输入框无法输入的故障,并增加教室外的楼道场景。 源码和制作方法:人工智能的三维虚拟世界,完全免费、完全开源、完整无缺,一步步教你怎么制作这个游…

各种变量

1.局部变量2.实例变量相当于把Hello拿了出来,作为一个变量类型来使用 布尔值的默认值是false 3.类变量4.常量

【LCA 树上两点的距离 判定点是否在某条边中】洛谷P3398 仓鼠找sugar

题目链接:P3398 仓鼠找 sugar - 洛谷 | (luogu.com.cn) 题目大意:判定一棵树上的两条边是否相交 Tag: [LCA] [树上两点间距离的计算] [如何判断与点在某条路径上] 思路: \[\begin{align} &1.建图\\ &2.\text{dfs}然后\ 计算出每个点的深度 和计\text{anc}(i,j)\\ &…

go-zero微服务框架的静态文件服务

目录go-zero微服务框架的静态文件服务go-zero版本新建项目目录新建 demo.api 文件生成api代码新建建太文件查看文件目录写入静态服务代码访问1.html参考文档 go-zero微服务框架的静态文件服务 go-zero版本 go-zero v1.7.0 新建项目目录mkdir demo cd demo新建 demo.api 文件 de…

代码随想录Day4

24.两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1: 输入:head = [1,2,3,4] 输出:[2,1,4,3]示例 2: 输入:head = [] 输出:[]示例 3: 输入:head…

Go 静态编译及在构建 docker 镜像时的应用

Go 语言具有跨平台和可移植的特点,同时还支持交叉编译,可以在一个系统上编译出运行在另一个系统上的二进制可执行文件,这是因为 Go 在编译时支持将依赖的库文件与源代码一起编译链接到二进制文件中,所以在实际运行时不再需要依赖运行环境中的库,而只需要一个二进制文件就可…

JDK与JRE区别

JDK:是整个Java的核心,包含运行环境+一系列的开发工具包 JRE:java程序开发环境+核心工具类+JVM等。不能用于编译工作。 每天坚持,终会抵达!