mysql事务隔离级别可重复读_innodb默认隔离级别

mysql事务隔离级别可重复读_innodb默认隔离级别一般的DBMS系统,默认都会使用读提交(Read-Comitted,RC)作为默认隔离级别,如Oracle、SQLServer等,而MySQL却使用可重复读(Read-Repeatable,RR)。要知道,越高的隔离级别,能解决的数据一致性问题越多,理论上性能损耗更大,可并发性越低。隔离级别依次为>:串行化>RR>RC>读未提交在SQL标准中,前三种隔离级别分别解决了幻象读、不可重复读和脏读的问题。那么,为什么MySQL使用可重复读作为默认隔离级别呢?这个是有历史.

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一般的DBMS系统,默认都会使用读提交(Read-Comitted,RC)作为默认隔离级别,如Oracle、SQLServer等,而MySQL却使用可重复读(Read-Repeatable,RR)。要知道,越高的隔离级别,能解决的数据一致性问题越多,理论上性能损耗更大,可并发性越低。隔离级别依次为>:串行化 > RR > RC >读未提交

在SQL标准中,前三种隔离级别分别解决了幻象读、不可重复读和脏读的问题。那么,为什么MySQL使用可重复读作为默认隔离级别呢?
这个是有历史原因的,要从主从复制开始讲起了!
1.主从复制,是基于什么复制的?
是基于binlog复制的
2.binlog有几种格式?
statement:记录的是修改SQL语句
row:记录的是每行实际数据的变更
mixed:statement和row模式的混合
那Mysql在5.0这个版本以前,binlog只支持STATEMENT这种格式!而这种格式在读已提交(Read Commited)这个隔离级别下主从复制是有bug的,因此Mysql将可重复读(Repeatable Read)作为默认的隔离级别!
接下来,就要说说当binlog为STATEMENT格式,且隔离级别为读已提交(Read Commited)时,有什么bug呢?如下图所示,在主(master)上执行如下事务:
在这里插入图片描述
此时在主库中查询:

select * from t;
  • 1

输出结果:

+---+---+
| c1 |c2
+---+---+
| 2 | 2
+---+---+
1 row in set
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

从库中查询:

select * from t;
  • 1

输出结果:

Empty set
  • 1

这里出现了主从不一致性的问题!原因其实很简单,就是在master上执行的顺序为先删后插!而此时binlog为STATEMENT格式,它记录的顺序为先插后删!从(slave)同步的是binglog,因此从机执行的顺序和主机不一致!就会出现主从不一致!
如何解决?
解决方案有两种!
(1)隔离级别设为可重复读(Repeatable Read),在该隔离级别下引入间隙锁。当Session 1执行delete语句时,会锁住间隙。那么,Ssession 2执行插入语句就会阻塞住!
(2)将binglog的格式修改为row格式,此时是基于行的复制,自然就不会出现sql执行顺序不一样的问题!奈何这个格式在mysql5.1版本开始才引入。
因此由于历史原因,mysql将默认的隔离级别设为可重复读(Repeatable Read),保证主从复制不出问题!

先说结论:
对于之前没有row格式的binlog的情况下,如果隔离级别是rc,有可能导致主从数据不一样。

例子:
隔离级别为rc,binlog格式为statement
select * from a;
b

1
2
3
4
5

session 1:
begin;
delete from a where b<=5;

session 2:
begin;
insert into a select 3;
commit;

session 1:
commit;

主库:
select * from a;
b
—-
3

从库:
select * from a;
empty set

此时的数据是不一样的。

原因:
(1)在rc隔离级别下,事务没有gap lock锁,因此可以在小于等于5的范围内插入一条新记录。
(2)binlog为statement记录的是master上产生的sql语句,按提交顺序记录的,因此binlog中记录的是先插入数据,后删除数据。(虽然master上是先删除数据后插入数据),逻辑上产生了不一致。

如何解决:
只需要解决上述问题中的一个就能保证数据的同步了。
(1)可以使用rr隔离级别;
(2)使用row格式的binlog;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/196984.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 富集分析集锦(KEGG富集分析图)

    链接:https://www.jianshu.com/p/988d90484f77不管是转录组,还是芯片数据,或者其他有关基因的组学分析,每当数据分析到后面,要想得到结果,都躲不过这个富集分析,因为它是帮助我们从庞杂的组学数据中发掘规律重要的一环,对基因功能进行富集分析,就有可能发现在生物学过程中起关键作用的生物通路,并且帮助理解生物学过程的分子机制。现在的高通量测序带来的巨大数据量,让我们眼…

  • 通达信的5分钟数据格式 *.lc5

    通达信的5分钟数据格式 *.lc532字节为单位:CD003F0233330F42-7B14114266660E423D0A1142B02FF64B-A4B20D0000000000>>>struct.unpack(‘hhfffffii’,buf)(205,575,35.799999237060547,36.270000457763672,35

  • polyfill什么意思_fill方法怎么使用

    polyfill什么意思_fill方法怎么使用     今天在做特征工程时,考虑给某列的缺失值,填充为该列的众数。按照之前填补均值和最大最小值的方法:importpandasaspddf.Mer_min_discount.fillna(df.Mer_min_discount.mode(),inplace=True)   结果发现缺失值怎么都填充不上,查阅资料后,恍然大悟,原来由于众数可能存在多个,所以pand…

  • 详述 IntelliJ IDEA 插件的安装及使用方法「建议收藏」

    详述 IntelliJ IDEA 插件的安装及使用方法「建议收藏」温馨提示:IntelliJIDEA支持非常多的插件,熟练的使用插件,能够有效提高我们的开发效率以及用户体验。正文首先,进入插件安装界面:Mac:IntelliJIDEA->Preferences->Plugins;Windows:File->Settings->Plugins.标注1:显示IntelliJIDEA的插件分类,Allplugins:显示In

  • simplescalar自动安装

    simplescalar自动安装1.在gedit(或其他的文本编辑器)中加入以下代码:NAME=SimplescalarPACKAGE=simplescalarTOOL=simpletools-2v0UTIL=simpleutilsSIM=simplesimsudoapt-getupdatesudoapt-getinstallflex-oldbisonbuild-essentia

  • mac如何删除隐藏文件_如何显示系统隐藏文件

    mac如何删除隐藏文件_如何显示系统隐藏文件U盘和移动硬盘接入Mac时会产生.Trashes,.Spotlight-V100,.fseventsd等文件每插入Mac一次,都会检查是否有这些文件,如果没有,就会创建这些文件特别是有时候,在文件

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号