一般的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;

输出结果:

+---+---+
| c1 |c2
+---+---+
| 2 | 2
+---+---+
1 row in set

从库中查询:

select * from t;

输出结果:

Empty set

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

[转]为什么mysql默认隔离级别设置为可重复读相关推荐

  1. Mysql默认隔离级别为什么是可重复读?

    知识点总结 1.数据库默认隔离级别: mysql -可重复读: oracle,postgres -已提交读 2.mysql binlog的格式三种:statement,row,mixed 3.为什么m ...

  2. 专题-子项-1-mysqlf-默认隔离级别为什么是可重复读?为什么业务代码建议用读已提交?

    经典参考:https://blog.csdn.net/java_collect/article/details/105042975 binlog有几种格式? 三种,分别是 ----statement: ...

  3. 关于数据库隔离级别为RR(可重复读)下是否解决幻读问题

    一.数据库隔离级别 隔离级别 脏读可能性 不可重复读可能性 幻读可能性 加锁读 READ UNCOMMITTED 是 是 是 否 READ COMMITTED 否 是 是 否 REPEATABLE R ...

  4. SpringCloud工作笔记054---事物处理_MySQL的四种事务隔离级别_以及修改Mysql默认隔离级别

    JAVA技术交流QQ群:170933152 Mysql修改默认隔离级别: MySQL mysql默认的事务处理级别是'REPEATABLE-READ',也就是可重复读 1.查看当前会话隔离级别 sel ...

  5. 隔离级别(Isolation Levels)-------可重复读(RR-Repeatable Read)

    10.3  隔离级别(Isolation Levels) 维护数据库的一致性和数据完整性,同时又允许多个应用程序同时访问同一数据,这样的特性称为并发性.DB2数据库用来尝试强制实施并发性的方法之一是通 ...

  6. Mysql 乐观锁 事务,Mysql事务隔离级别与乐观锁的问题

    问题一: 当事务隔离级别设置为可重复读的时候,将所有select过的行都加了读锁,并且记录了版本号,当update 的时候们如果发现版本号变了,则事务失败回滚.不知道我这样理解是否正确? 问题二: 如 ...

  7. mysql 默认事务隔离级别_上个厕所的功夫,搞懂MySQL事务隔离级别

    "隔离级别" 出于MySQL四大特性(ACID)中的"I",也就是隔离性.目的是实现数据.事务一致性"C". MySQL在多线程并发场景下, ...

  8. MYSQL系列---默认隔离级别所引发的问题

    1.事务的隔离级别: 1 .原子性.事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做 2 .一致性.事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态.因此当数据库只 ...

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

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

最新文章

  1. DPU加持下的阿里云如何做加密计算?
  2. (已解决torchvision中CIFAR10下载速度慢)如何下载以及使用torchvision导入
  3. mysql随机显示记录_MySQL随机读取表中记录
  4. 鸿蒙系统已经推出,华为号召力太吓人!鸿蒙系统发布短短两天,主流应用已开始适配!...
  5. 拼接字符SQL语句拼接 最后一个字符多出 处理方式
  6. SSD相关文章及博客
  7. 今晚8点直播丨经典知识库:数据库对象命名设计规范手册
  8. python模块介绍-Tornado:Tornado中文文档-概述
  9. Kata: 从随机的三字符列表组中恢复秘密字符串
  10. 手机网站和PC网站兼容的响应式网页设计
  11. 3.ZooKeeper客户端Curator的进阶使用「第三章 ZooKeeper Java客户端」「架构之路ZooKeeper理论和实战」
  12. arccatalog点要素显示不完_2020年仅剩100天,你的年假休完了吗?关于年假你不知道的7点!...
  13. html 弹出框 自动关闭,js提示框,n秒后自动关闭
  14. 任正非:向谷歌军团学习,扑上去,杀出一条血路
  15. 【一文读懂】python 中的 numpy.reshape(a, newshape, order=‘C‘) 详细说明及实例讲解
  16. Window alert() 方法
  17. 《第二行代码》学习笔记
  18. 入门行人重识别 尝试跑(郑哲东 简单行人重识别代码到88%准确率)过程
  19. Wordpress响应式Git主题/响应式CMS主题模板
  20. 中国互联网著名天使投资人及投资领域

热门文章

  1. 【以太坊源码阅读】椭圆曲线加密和EIP155
  2. make: 'pcs.o' is up to date.问题解决
  3. sql组合键设置外键_学习SQL:外键
  4. pls-toolbox_使用T-SQL Toolbox数据库解决时区,GMT和UTC问题
  5. threejs CameraHelper 查看照相机的观察范围
  6. tp中  M和 D的区别
  7. powershell 设置代理_WSL2中使用proxychains ng代理加速
  8. 集合交集,并集,差集运算
  9. express+mysqle
  10. 如何在C++中产生随机数