我们都知道可重复读隔离级别可以解决脏读、不可重复读。那么具体是如何解决的呢?
下面先通过实验来演示可重复读能够解决脏读、不可重复读问题,然后解释具体的原因。

环境搭建

1. 建立两个session连接MySQL,session1和session2

关闭session1和session2的事务自动提交。

set autocommit=0; // 关闭自动提交
select @@autocommit; // 查看当前session的自动提交状态


2. 将session1和session2的隔离级别设置为可重复读。

set tx_isolation='repeatable-read'; // 设置当前session的隔离级别为可重复读
select @@tx_isolation; //查看当前session的隔离级别


3. 随便创建一张表,我这里是user。

这里是user中的数据:

开始实验

1. 首先在session2中查询name='zz’的数据。

select * from user where name='zz';


2. 在session1中开启事务,然后改变name='zz’的age字段为46。

begin; // 开启事务
update user set age=46 where name='zz';  //更新数据


这时候session2中肯定是查不到数据的更改的,也就解决了脏读的问题:

3.将session1中的事务进行提交,再次到session2中查询该字段。

commit; // session1中提交事务
select * from user where name='zz'; //session2中再次查询该字段


这就解决了不可重复读的问题。

底层解释

1. 在InnoDB中,解决事务的隔离性(Isolation)是通过多版本并发控制(MVCC)和锁(lock)机制来实现的。
2.表(user)中的数据是有两个状态的,prepare和commit。其中prepare是事务提交之前数据的状态,而commit是事务提交之后的状态。
3.数据通过MVCC控制是具有多个版本的,其原理是:MVCC会在每行数据上增加两个字段,事务ID(DB_TRX_ID)和指向前一个数据的指针(DB_ROLL_PTR),根据指针和事务ID,就可以实现行数据的多版本。

4.在可重复读的隔离级别下,InnoDB每次进行select查询语句,只有第一次执行select语句会产生数据快照(整张表的快照),之后执行相同的select语句,不再产生数据快照,那么下次使用相同语句查询时,访问的快照仍然是第一次产生的数据快照。那么即使当session1提交(commit)事务之后,session2访问的仍然是事务提交之前的即数据处于prepare状态的数据快照。这就解决了不可重复读的问题。

可重复读隔离级别如何解决脏读、不可重复读相关推荐

  1. MySQL可重复读隔离级别能解决幻读吗?

    事务及事务隔离级别 innodb存储引擎支持事务,myisam不支持事务 事务内的操作要么全部成功,要么全部失败,中途有失败则回滚 事务的ACID:原子性,一致性,隔离性,持久性 事务隔离级别需要解决 ...

  2. MySQL可重复读隔离级别为何没有解决幻读(MVCC原理简介)

    MySQL可重复读隔离级别为何没有解决幻读(MVCC原理简介) 一.MCVV简介 二.可重复读隔离级别能解决幻读? 三.什么是当前读和快照读? 四.MVCC的实现原理 五.RC,RR级别下的InnoD ...

  3. Mysql可重复读隔离级别下如何解决幻读

    Mysql可重复读隔离级别下如何解决幻读 一些概念 具体加锁说明 使用主键索引进行等值查询 使用主键索引进行范围查询 使用二级索引进行等值查询 使用二级索引进行范围查询 一些概念 幻读:在一次事务中, ...

  4. MySQL 可重复读隔离级别,完全解决幻读了吗?

    我在上一篇文章中提到,MySQL InnoDB 引擎的默认隔离级别虽然是「可重复读」,但是它很大程度上避免幻读现象(并不是完全解决了),解决的方案有两种: 针对快照读(普通 select 语句),是通 ...

  5. MySQL事务的四种隔离级别,mysql中的不可重复读和幻读的区别,Repeatable read可重复读隔离级别下怎么不存在幻读问题?

    1. 事务的隔离级别 1.1 read uncommited:读未提交.一个事务读到了另一个事务未提交的脏数据,称之为脏读. 1.2 read commited:读已提交.解决了脏读问题,但当前事务两 ...

  6. 深入学习InnoDB可重复读隔离级别下如何避免幻读

    一.InnoDB可重复读隔离级别下如何避免幻读 在理解什么是幻读之前,先了解下脏读.幻读.不可重复读在实操场景中的现象. 脏读:指的就是一个事务读取到了另一个事务还未提交的数据,当该事物将数据回滚,则 ...

  7. mysql可重复读 加锁_mysql可重复读隔离级别加锁分析

    问题 myql可重复读隔离级别下可能会导致插入阻塞,问题复现如下 表中有3列都是int类型 其索引情况如下: id为主索引,c,d为普通索引 现在开始制作问题: 在这里我分别开启两个事务:第一个事务中 ...

  8. MySQL可重复读应用场景_mysql-repeatable read 可重复读隔离级别-幻读实例场景

    本文详解 repeatable read 可重复读 隔离级别产生的影响(幻读) -- SERIALIZABLE serializable 序列化 :一个个事务排成序列的形式.事务一个挨一个执行,等待前 ...

  9. mysql与缓存脏读_MySQL 事务的隔离级别问题 之 脏读

    1. 脏读 所谓的脏读就是指一个事务读取了另一个事务未提取的数据. 试想一下:a账户要给b账户100元购买商品,如果a账户开启一个事务,执行下面的update语句做了如下转账的工作: update a ...

最新文章

  1. 深入浅出SpringBoot源码分析
  2. win7访问windows server 2003服务器出现未知的用户名或者错误的密码(转载)
  3. 第一个PowerShell脚本——PowerShell三分钟(九)
  4. python可以测试java的代码吗_使用python做你自己的自动化测试--对Java代码做单元测试 (2)-导入第三方jar包裹...
  5. linux下载命令 scp,linux命令详解之scp命令
  6. 安全云盘项目(二):2.1 基于libevent的C++线程池
  7. Oracle ITL(Interested Transaction List)理解
  8. Oracle 11gR2 中 示例用户 安装说明
  9. 华为BFD的配置规范
  10. tm8211的i2s协议
  11. c语言jni调用外部函数,(转)JNI调用C函数
  12. android退出中国,曾经的安卓机皇宣布关闭中国社区,彻底放弃手机业务了?
  13. Linux软链接的创建,删除,修改
  14. 将文本格式转为kindle可用格式
  15. java满天星星闪烁_满天星空的星星为什么闪烁?
  16. 图表控件TeeChart安装使用
  17. 强化学习入门笔记 | UCL silver RL | UC Berkely cs285 DRL
  18. java通过aspose.words将两个word文档合并
  19. office365离线安装
  20. C语言逻辑运算符顺序

热门文章

  1. 多角度探讨灵活可扩缩的云上游戏解决方案
  2. MT-InSAR原理和发展_刘计洪
  3. 漏洞通告 | Oracle发布7月更新, 修复墨云科技报告的高危漏洞
  4. jpa查询表的部分字段
  5. 2018最新引流脚本话术设置,引流话术大全集合
  6. 代码整洁之道精华——第十四章 逐步改进
  7. input在python的意思_pythoninput是什么意思
  8. 基于自动驾驶需求的线控转向设计方法
  9. 2021长安“战疫”网络安全卫士守护赛 misc部分writeup
  10. .net4.0注册到IIS ,重新注册IIS ,iis注册