概念

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 可重复读_mysql 可重复读相关推荐

  1. mysql重连_mysql自动重连

    最近部署一个系统,后台用线程池来处理请求,而每个线程有一个mysql连接.当系统运行一阶段后,有些请求会出现操作"Internal error",而操作一次可能又会成功.经过多方调 ...

  2. mysql存储过程重命名_MySQL数据库重命名存储过程

    MySQL不支持将整个数据库(db schema)重命名,我们可以通过自己写一个存储过程来实现. 实现思路: 1)创建目标数据库. 2)执行命令:rename table 原库.表 to 目标库.表, ...

  3. mysql连接所有字段_mysql:重命名连接的所有字段

    我没有发现任何相关信息. 这是我的查询: SELECT p.*, pa.*, a.* FROM produit p LEFT OUTER JOIN produit_attribut pa ON p.i ...

  4. mysql不可重复读和重复读_MySql隔离级别:RU / RC / RR / S + 脏读 / 不可重复读 / 幻读 / 可重复读...

    MySQL 事务 本文所说的 MySQL 事务都是指在 InnoDB 引擎下,MyISAM 引擎是不支持事务的. 数据库事务指的是一组数据操作,事务内的操作要么就是全部成功,要么就是全部失败,什么都不 ...

  5. 揭秘Mysql事务隔离级别之可重复读

    揭秘Mysql事务隔离级别之可重复读 1.可重复读的来源 2.何为不可重复读 3.那么可重复读和不可重复读究竟有什么关系呢? 4.模拟不同事务隔离级别对不可重复的处理情况(有线程执行顺序). 4.1. ...

  6. mysql可重复读_到底什么是mysql的幻读和不可重复读

    幻读和不可重复读的定义 事务A 按照一定条件进行数据读取, 期间事务B 插入了相同搜索条件的新数据,事务A再次按照原先条件进行读取时,发现了事务B 新插入的数据称为幻读. 如果事务A 按一定条件搜索, ...

  7. 视图的重命名mysql语句_sql语句重命名字段-视图重命名sql语句-数据库重命名sql语句...

    sql语句如何重命名表名和列名? 一.更改数据库名 sp_renamedb 更改数据库的名称. 语法: sp_renamedb [ @dbname = ] ' old_name ' , [ @newn ...

  8. node.js+MySql数据库+HTML实现内部查重系统

    node.js+MySql数据库+HTML实现内部查重系统 实现目标: 1.将每个人的项目登记,存入MySql数据库 2.在填写时进行实时正则判断,判断每项输入格式是否正确,方便之后进行查重对比 3. ...

  9. mysql 前后代表什么_MySQL的锁

    1.什么是锁 锁机制用于管理对共享资源的并发访问. lock与latch latch一般称为闩锁(轻量级的锁),因为其要求锁定的时间必须非常短.若持续的时间长,则应用的性能会非常差.在InnoDB存储 ...

最新文章

  1. 17DOM之操作元素
  2. 云+X案例展 | 传播类:富通云腾加速联通云数字化转型步伐
  3. mac安装thrift
  4. Spring Boot与Spring Cloud是什么关系?
  5. NAACL 2018 | 最佳论文:艾伦人工智能研究所提出新型深度语境化词表征
  6. libRTMP 整体说明
  7. Python小程序(3)--BMR(基础代谢率)计算器
  8. 程序员工资真的很高么,月入几万的难道不是吹牛?
  9. 2021-10-21-Flask-04 模型关系的建立,增删改查的演示,一篇文章让你直接搞懂Flask模型
  10. 智能DNS解析搭建成功
  11. 关于勾股数的规律及证明
  12. (NO.00004)iOS实现打砖块游戏(一):素材的制作
  13. Unity开发2 3D对象的简单操作
  14. 构造方法调用另一个构造方法
  15. dlib人脸对齐(python)
  16. Synctoy2.1使用定时任务0X1
  17. MACD多周期共振指标公式,日周月共振
  18. 美科学家试解“姆潘巴现象”
  19. 爱码物联 二维码营销Saas平台_为中小微企业而生
  20. locust之简介(1)

热门文章

  1. OSPF双点双向重发布
  2. Linksys WRT1900ACS刷OpenWrt
  3. 干细胞培育实验室设计要求
  4. 大直径测径仪边缘检测 大口径钢管质量检测未来
  5. python一个等号和两个等号_申请抖音号需要什么,抖音怎么申请两个号呢
  6. U盘中Kiss病毒之后
  7. linux服务器python环境配置+pycharm连接服务器操作
  8. 【Java日志系列实践2】AOP切面实现业务日志
  9. chown chmod用法
  10. Python 字节流、字符串、十六进制相互转换(binascii、bytes)