mysql可重复读现象及原理分析

一、可重复读

我们先看看现象,再分析原理。我的mysql版本是5.5。

下面是一张表,只有一条数据,并且我开启了事物

此时,另一个事物将record加1,因此我在开启一个命令行客户端,执行下面的命令:

成功加1之后,实际上,数据库中record肯定是2。

然后回到之前的客户端,再查一次:

没毛病,record还是1,果然是可重复读。有些人以为mysql的可重复读是通过行锁实现的,

从上面可以知道,肯定不是,如果是的话,第一次select * from test的时候,id=1的记录就会加行锁,我都加行锁了,我还没提交,另外的事物是怎么update成功的。

结论就是mysql使用的MVCC(多版本并发控制),MVCC详解可以看:https://blog.csdn.net/whoamiyang/article/details/51901888

我们继续,我之前的第一个事物还没提交,不过提交之前,我也想加1;

加完之后我再查一下,额,record是3,好像很奇怪,但也不奇怪。

其实,update test set record=record+1 where id=1;这条语句中,在加1之前,他知道自己等于2,然后2+1=3。

也就是说,update时读取数据是最新版本的数据,而select是到当前事物版本为止的数据。当更新成功之后,当前版本即为最新版本,再次select,读取的是最新的数据。

在这里讨论下乐观锁的必要性。下面是乐观锁的实现,实现乐观锁,我们一般会这么做

update test set record=record+1 where id=1 and record=1;

如果不用乐观锁,你用select读取到的值其实根本不准确。除非你开启悲观锁,像下面这样:

select * from test where id=1 for update;

这样可以读取到最新的内容,同时在你当前的事物提交之前,其他事物的update此条记录将会锁等待。

故事到此,还没有结束,此时我们开启事物三,也做加1操作看会发生什么。

结果是,锁等待超时,也就是说(事物一)在更新完后,会加行锁,这个应该比较好理解。事物中,刚开始查询的时候是不会加行锁的,但是当有更新操作之后,会加行锁,直到事物提交。

因为事务一还没有提交,所以事务三的select * from test;还只能查询到事务二提交的结果,也就是record是2

然后因为事务一中对id=1这条数据进行了修改,所以mysql自动将这条数据开启了行锁,在事务一提交之前,任何事务不可以修改id=1这条数据

本文转自:

mysql可重复读现象及原理分析 - mysql数据库栏目 - 红黑联盟

https://www.2cto.com/database/201807/763885.html

mysql可重复读有什么好处_mysql可重复读现象及原理分析相关推荐

  1. mysql xid原理_MySQL数据库分布式事务XA实现原理分析

    [IT168 技术]MySQL XA原理 MySQL XA分为两类,内部XA与外部XA;内部XA用于同一实例下跨多个引擎的事务,由大家熟悉的Binlog作为协调者;外部XA用于跨多MySQL实例的分布 ...

  2. mysql排重_mysql 排重查询

    GROUP BY 语句可以实现某一列的去重查询. 直接上语句: select io_dev_id from io_info where (TID=1 AND host_name='yang1') GR ...

  3. mysql 可重复读 快照_MYSQL可重复读及原理、快照读和当前读

    什么是可重复读 可重复读的实现 Repeatable Read(可重复读):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录(读已经提交的,其实是读早于本事务开始且已经提交的),但是不能看到 ...

  4. mysql可重复读概念_Mysql可重复读原理

    概念 可重复读的实现 Repeatable Read(可重复读):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录(读已经提交的,其实是读早于本事务开始且已经提交的),但是不能看到其他事务对 ...

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

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

  6. 「Mysql 事务 隔离级别」 读提交和可重复读的区别

    一.前提 首先我们应该先明确 Mysql的四种隔离级别和四种对应的现象 隔离级别: 读未提交.读已提交.可重复读.串行化 现象: 脏读.丢失修改.不可重复读.幻读 二.先说结论 读提交和可重复读都是一 ...

  7. 多图理解MySQL事务的隔离等级,脏读,不可重复读,幻读的几大概念

    2021.3.17 今天在阅读<高性能MySQL>的第一章时,遇到了四大隔离等级的概念,反复琢磨了许久,最后弄出了几张图来帮助记忆,希望对路过的博友们有帮助. 目录 概念定义 三大问题之一 ...

  8. MySQL是如何实现读已提交和可重复读的——MVCC原理

    先来看一下MySQL的事务隔离级别: 隔离级别 脏读 不可重复读 幻读 读未提交 有 有 有 读已提交 无 有 有 可重复读 无 无 有 串行化 无 无 无 MySQL有四种隔离级别:读未提交.读已提 ...

  9. MYSQL专题: 脏读、幻读、不可重复读区别及解决方案

    并发场景下事务会存在那些数据问题? 并发场景下mysql会出现脏读.幻读.不可重复读问题: 1. 脏读 dirty read(读到未提交的数据): A事务正在修改数据但未提交,此时B事务去读取此条数据 ...

最新文章

  1. 【OpenCV 4开发详解】颜色模型与转换
  2. [第五章] 领域模型
  3. 容器重启后配置失效问题
  4. 孙鑫老师教学视频学习笔记——单文档中菜单操作
  5. 『第26天』Sunos (一)
  6. h5MYSQL并进行增删查改_mysql增删改查
  7. Linux下目录快速切换小工具bd
  8. js百度地图android定位不准,百度地图js定位不准
  9. 串口速度,RS232与MAX232的区别
  10. 【重点】剑指offer——面试题62:序列化二叉树
  11. html仿win10第一次开机效果,纯 HTML/CSS 高仿 Win10 加载动画
  12. 网络蜘蛛的基本原理--转载
  13. 建模助手 —『 CAD图层管理 』Revit视图干净清爽
  14. 万人血书的前端开发自学资料(书籍+教程),它来了~
  15. LayaAirIDE的可视化2D物理使用文档
  16. 【概念学习】联邦学习的三个类别+【论文阅读】异步联邦学习
  17. 【收藏】2018-2019届互联网大厂公司校招薪资汇总,基本年薪都在20万以上
  18. 整型与指针的相互转换(int-int*,long-long*)
  19. css样式-淘宝评价
  20. SQL 创建数据库和表

热门文章

  1. android 填充,Android Drawable部分填充
  2. python和R写出表达矩阵为稀疏矩阵matrix.mtx.gz的方法
  3. python使用cv2库、下载opencv库
  4. 比星链和6G还牛,中国在通信领域研究的新方向将奠定全球领先地位
  5. Java--->编程题之水仙花
  6. NGUI之UIScrollView
  7. 国家质量基础设施NQI系统开发,NQI一站式服务平台建设
  8. 5.1.3 配置主机名和IP地址的映射关系
  9. java中bpmn流程图_工作流-bpmn流程图说明
  10. sqlyog 打不开