概念

  Repeatable Read(可重复读):即:事务A在读到一条数据之后,此时事务B对该数据进行了修改并提交,那么事务A再读该数据,读到的还是原来的内容。

实现原理(MVCC [ 多版本并发控制 ])

  InnoDB在每行记录后面保存两个隐藏的列来,分别保存了这个行的创建时间和行的删除时间。这里存储的并不是实际的时间值,而是系统版本号,当数据被修改时,版本号加1
  在读取事务开始时,系统会给当前读事务一个版本号,事务会读取版本号<=当前版本号的数据
  此时如果其他写事务修改了这条数据,那么这条数据的版本号就会加1,从而比当前读事务的版本号高,读事务自然而然的就读不到更新后的数据了

现在通过实验,对问题进行下分析:

1.在终端A开启事务A,查询一下。

START TRANSACTION;
select spt.id,spt.audit_status,spt.is_deleted from stat_point_task spt limit 5;

结果如下:

2.在终端B开启事务B,进行同样的查询,可见结果和事务A中的结果是一样的。

START TRANSACTION;
select spt.id,spt.audit_status,spt.is_deleted from stat_point_task spt limit 5;

3. 在事务A中,更新一下,将id=3的audit_status更新为3,查询一下,发现更新成功,然后提交事务A;

update stat_point_task set audit_status=3,is_deleted=0 where id=3;
select spt.id,spt.audit_status,spt.is_deleted from stat_point_task spt limit 5;
commit;

4. 此时,事务A更新了数据,并进行了提交,返回来再看事务B,在事务B中进行查询,发现查询到的还是事务A更新之前的数据。

/*再查询下,因为可重复读,发现查询到的还是事务A更新之前的数据*/
select spt.id,spt.audit_status,spt.is_deleted from stat_point_task spt limit 5;

  上面我们对MySQL的默认隔离级别可重复读通过进行实验进行了解释,但是,此时我有一个问题,就是事务B在进行更新的时候,是在事务A更新后的基础上更新,还是A更新前(和B通过查询得到的数据保持一致)的基础上更新,下面通过实验来分析这个问题。

5.在事务B中更新数据,假设A的更新影响到事务B,在事务A的查询结果中id=3的这条数据对应的audit_status为3,在事务B中的这条语句影响的行数应该为0,不会将audit_status设为4。

update stat_point_task set audit_status=4 where id=3 and audit_status=1;
select spt.id,spt.audit_status,spt.is_deleted from stat_point_task spt limit 5;

  我们通过下面的语句再次验证下 ‘对事务B进行更新时,事务A提交的更新影响到了事务B’ ,此时事务A中提交的更新已经将id=3的audit_status更新为3,虽然因为可重复读,事务B中查询到的id=3的audit_status为1,但是在事务B中进行如下的更新的时候,却更新成功了,成功将audit_status更新为5.

update stat_point_task set audit_status=5 where id=3 and audit_status=3;
select spt.id,spt.audit_status,spt.is_deleted from stat_point_task spt limit 5;
/*最后记得提交B事务*/
commit;

综上:

  因为MySQL的可重复读,对事务B进行查询时,事务A提交的更新不会影响到事务B。

  但是对事务B进行更新时,事务A提交的更新会影响到事务B。

出处:https://www.cnblogs.com/Allen-win/p/8283102.html

mysql 可重复读的更多相关文章

  1. Mysql可重复读原理

    mysql可重复读现象及原理分析 InnoDB---可重复读隔离级别的底层实现原理 概念 可重复读的实现 Repeatable Read(可重复读):一个事务在执行过程中可以看到其他事务已经提交的新插 ...

  2. MySQL 可重复读,差点就我背上了一个 P0 事故!

    小黑黑的碎碎念 哎,最近有点忙,备考复习不利,明天还要搬家,好难啊!! 本想着这周鸽了,但是想想还是不行,爬起来,更新一下,周更可不能断.偷懒一下,修改一下之前的一篇历史文章,重新发布一下. P0 事 ...

  3. MySQL的可重复读级别能解决幻读吗

    引言 之前在深入了解数据库理论的时候,了解到事物的不同隔离级别可能存在的问题.为了更好的理解所以在MySQL数据库中测试复现这些问题.关于脏读和不可重复读在相应的隔离级别下都很容易的复现了.但是对于幻 ...

  4. MySQL的可重复读级别能解决幻读问题吗?

    之前在深入了解数据库理论的时候,了解到事务的不同隔离级别可能存在的问题.为了更好的理解所以在MySQL数据库中测试复现这些问题.关于脏读和不可重复读在相应的隔离级别下都很容易的复现了. 但是对于幻读, ...

  5. 面试官:MySQL的可重复读级别能解决幻读问题吗?

    引言 之前在深入了解数据库理论的时候,了解到事务的不同隔离级别可能存在的问题.为了更好的理解所以在MySQL数据库中测试复现这些问题.关于脏读和不可重复读在相应的隔离级别下都很容易的复现了. 但是对于 ...

  6. [原创]MySQL RR隔离级别下begin或start transaction开启事务后的可重复读?

    Server version:         5.6.21-log MySQL Community Server (GPL) 前提提要: 我们知道MySQL的RR(repeatable read)隔 ...

  7. MySQL选用可重复读之前一定要想到的事情

    原文地址:http://blog.itpub.net/29254281/viewspace-1398273/ MySQL选用可重复读隔离级别之前一定要想到的事情.间隙锁 MySQL在使用之前有三个务必 ...

  8. Mysql事务,并发问题,锁机制-- 幻读、不可重复读(转)

    1.什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点. 原子性:要不全部成功,要不全部撤销 隔离性:事务之间相互独立,互不干扰 一致性:数据库正确地改变状态后,数据库的一致性约 ...

  9. [MySQL]对于事务并发处理带来的问题,脏读、不可重复读、幻读的理解

    一.缘由 众所周知MySQL从5.5.8开始,Innodb就是默认的存储引擎,Innodb最大的特点是:支持事务.支持行级锁. 既然支持事务,那么就会有处理并发事务带来的问题:更新丢失.脏读.不可重复 ...

随机推荐

  1. 8.docker的系统资源限制

    一. 概述 默认docker容器使用的memory资源和CPU资源是没有限制的,但是我们可以在docker run的时候通过选项去限制,具体参考官方文档. [root@node1 ~]# docker ...

  2. Arduino-位操作

    读取指定位的数据 int x=bitRead(0x81,7);    //0x81从右向左依次为第0位到第15位,第2个参数为第7位的1复制给x,使x=1 把数据写到指定位 int x=13; //x ...

  3. 【NOIP2016提高A组8.12】通讯

    题目 "这一切都是命运石之门的选择." 试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短信,并由此得知了伦太郎制作出了电话微波炉(仮). 为了掌握时间机器的技术 ...

  4. css常用小知识点汇总(一)

    1.文本过多溢出,怎么让他隐藏变成点点点(...)呢? text-overflow:ellipsis;overflow:hidden;display:-webkit-box;-webkit-line- ...

  5. Day01_初识Python

    Python简介 Python的历史 1.1989年圣诞节:Guidao von Rossum开始写Python语言的编译器 2.1991年2月:第一个Python编译器(同时也是解释器)诞生,他是使 ...

  6. DI,依赖注入,给对象赋值 ,get,set,list,set,map,properties对象赋值

  7. java构造方法和重写equals

    Cell的构造函数 package Test; import java.util.Objects; public class Cell { int a; int b; public int getA( ...

  8. php array_keys()函数 语法

    php array_keys()函数 语法 作用:返回包含数组中所有键名的一个新数组.直线电机选型 语法:array_keys(array,value,strict) 参数: 参数 描述 array ...

  9. setData 机制

    解释:setData 函数,用于将数据,从逻辑层发送到视图层,当开发者调用 setData 后,数据的变化,会引起视图层的更新.参数说明 属性 类型 是否必填 描述 data Object 是 这次要 ...

  10. 【PowerOJ1739&网络流24题】魔术球问题(最大流)

    题意: 思路: 0.[问题分析] 枚举答案转化为判定性问题,然后最小路径覆盖,可以转化成二分图最大匹配,从而用最大流解决. [建模方法] 枚举答案A,在图中建立节点1..A.如果对于i<j有i+ ...