概念

  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. BZOJ4625 [BJOI2016]水晶 最小割

    题意简述 给你一个三维的坐标系,坐标系上 \((x_i+y_i+z_i)\bmod 3 = 0\) 的点内有能量源.给定 \(n\) 个点含有能量值为 \(c_i\) 的水晶,如果一个水晶位于能量源上 ...

  2. js中或者vue中 Object.assign()用法详解

    Object.assign()是浅拷贝. 合并对象 var o1 = { a: 1 }; var o2 = { b: 2 }; var o3 = { c: 3 }; var obj = Object. ...

  3. Java调用Fortran生成so库报“libifport.so.5: 无法打开共享对象文件”错误解决方法

    source /opt/intel/bin/compilervars.sh intel64

  4. Thread的几种方法的使用

    1:setPriority() 设置线程的优先级,从1 到10.   5是默认的.  1是最低优先级. 10是最高优先级 public class MyThread01 implements Runn ...

  5. python list 插入元素

    https://www.jb51.net/article/57923.htm List 是 Python 中常用的数据类型,它一个有序集合,即其中的元素始终保持着初始时的定义的顺序(除非你对它们进行排 ...

  6. 【PowerOJ1756&网络流24题】最长k可重区间集问题(费用流)

    题意: 思路: [问题分析] 最大权不相交路径问题,可以用最大费用最大流解决. [建模方法] 方法1 按左端点排序所有区间,把每个区间拆分看做两个顶点<i.a><i.b>,建立 ...

  7. 基于vue模块化开发后台系统——构建项目

    文章目录如下:项目效果预览地址项目开源代码基于vue模块化开发后台系统--准备工作基于vue模块化开发后台系统--构建项目基于vue模块化开发后台系统--权限控制 前言 在熟悉上一篇说到准备工具之后, ...

  8. MySQL数据库:RESET MASTER、RESET SLAVE、MASTER_INFO、RELAY_LOG_INFO

    MySQL数据库:RESET MASTER.RESET SLAVE.MASTER_INFO.RELAY_LOG_INFO RESET MASTER 删除所有index file中记录的所有binlog ...

  9. P3928奶酪

    传送 今天早晨,神志不清的我决定拿头过这道题 终于在wa了6次之后过了 emm  明明都是一些细节自己却注意不到啊啊啊不能再颓了!!!!!!!!!!!! 好了回归正题 首先我们要开long long ...

  10. postgresql_action

    SELECT * FROM x123_area a LEFT JOIN x123_user_task_brief utb ON utb.ref_area_code = a.area_code WHER ...