Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【MySql】RR 与 RC的本质区别

【MySql】RR 与 RC的本质区别

作者头像
平凡的人1
发布于 2023-10-15 04:33:47
发布于 2023-10-15 04:33:47
84800
代码可运行
举报
运行总次数:0
代码可运行
本篇博客介绍的是RR与RC的本质区别,话不读说,直接进入主题即可。

当前读与快照读

select * from user lock in share mode ,以加共享锁方式进行读取,对应的就是当前读 不加lock in share mode就是快照读

  • 设置隔离级别RR

首先设置隔离级别RR

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set global transaction isolation level repeatable read;

设置完毕之后要进行重启终端才会生效。

两个场景

现在创建一张表插入一条数据用于测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
insert into user (id, age, name) values (1, 15,'黄蓉');

情景一:事务A和事务B开启事务,然后对事务A与事务B进行快照读是一样的结果,现在对事务A更新数据age=18,然后提交事务;此时事务A已经是提交的了;而事务B进行快照读select * from,没有读取到18,这很好理解,这是可重复读的隔离级别嘛,事务B提交之后才能看到;但是如果此时事务B没提交,而事务B此时进行当前读select lock in share mode则可以读取到18

启动两个终端分别对应事务A与事务B,结果如下图所示:

在隔离性这里如果想读到最新数据也是可以读到的。

情景二:事务A的操作与情景一是一样的,事务A把age改成了28;但是事务B进行快照读是在事务A提交之后才进行的,此时看到的是28,之后如果在进行当前读读取到的也是28

情景一与情景二:唯一区别仅仅是表1的事务B在事务A修改age前快照读过一次age数据;而表2的事务B在事务A修改age前没有进行过快照读 对于情景一:事务B在快照读的时候mysql就给事务B形成了一个read view;快照的对象认为A是与其一块运行的。事务B认为事务A在自己的m_ids列表中。所以看不到事务A提交的修改了。情景二:事务B并没有快照读,没有形成read view对象,事务A提交之后才进行快照读,此时看待并发的事务时,事务A已经不存在了,此时事务B看到的事务列表的最小值都比事务A大,事务B 能看到事务A的修改。 事务中快照读的结果是非常依赖该事务首次出现快照读的地方,即某个事务中首次出现快照读,决定该事务后续快照读结果的能力;delete同样如此

RR 与 RC的本质区别

正是Read View生成时机的不同,从而造成RC,RR级别下快照读的结果的不同;在RR级别下的某个事务的对某条记录的第一次快照读会创建一个快照及Read View, 将当前系统活跃的其他事务记录起来 此后在调用快照读的时候,还是使用的是同一个Read View,所以只要当前事务在其他事务提交更新之前使用过快照读那么之后的快照读使用的都是同一个Read View,所以对之后的修改不可见。 即RR级别下,快照读生成Read View时,Read View会记录此时所有其他活动事务的快照,这些事务的修改对于当前事务都是不可见的而早于Read View创建的事务所做的修改均是可见 而在RC级别下的事务中,每次快照读都会新生成一个快照和Read View, 这就是我们在RC级别下的事务中可以看到别的事务提交的更新的原因

总之在RC隔离级别下,是每个快照读都会生成并获取最新的Read View;而在RR隔离级别下,则是同一个事务中的第一个快照读才会创建Read View, 之后的快照读获取的都是同一个Read View。正是RC每次快照读,都会形成Read View,所以,RC才会有不可重复读问题。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-06-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Django内置的通用类视图及实例
表示对象列表的一个页面. 执行这个视图的时候,self.object_list将包含视图正在操作的对象列表(通常是一个查询集,但不是必须). 属性:
菲宇
2019/06/13
3.2K0
Django内置的通用类视图及实例
Django源码学习-8-ListView&DetailView通用视图
Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
小团子
2019/08/06
1.5K0
Django实战篇-论坛回帖视图
使用 Django 的模型,都是 django.db.models.Model 类的子类。
小团子
2019/07/18
5960
Django实战篇-论坛回帖视图
Django2.0中文(通用视图)
1、通用视图 urls.py: from django.views.generic import TemplateView path(r'about/',TemplateView.as_view(template_name="about.html")), 2、通用视图 about.html xx/templates/about.html
用户5760343
2022/05/14
8060
Django实战篇-论坛话题视图
上一节的注册中,使用了 form 表单,在 <form> 标签中,定义了 method 属性告诉浏览器想如何与服务器通信。HTTP 规范定义了几种 request methods 请求方法,需要使用 GET 和 POST。
小团子
2019/07/18
7210
Django实战篇-论坛话题视图
基于 Django 的个人网站(4)
考虑到分类页面是一个用来展示属于当前类别的所有文章,和首页一样的格式,就是显示的列表项十有八九会比首页少,因此分类页面的视图直接继承首页的视图,然后重写 get_queryset 方法就完事了,代码如下:
不可言诉的深渊
2020/05/27
1.2K0
基于django的视频点播网站开发-step9-后台视频管理功能
从本讲开始,我们开始视频管理功能的开发,视频管理包括视频上传、视频列表、视频编辑、视频删除。另外还有视频分类的功能,会一同讲解。这一讲非常重要,因为你将学习到一些之前没有学过的技术,比如大文件上传技术。
西门吹雪1997
2019/03/04
1.7K0
基于django的视频点播网站开发-step11-后台用户管理功能
这是一个普通的视图类,通过get()和post()来完成用户添加的功能,get里面负责页面的展示,post里面负责逻辑处理。在get中,初始化form为UserAddForm,因为添加的用户是有类别的,所以我们在UserAddForm中应用了is_staff字段来表示管理员。在post中,我们通过user.set_password(password)来设置新密码。user.save()来保存记录到数据库。保存成功后会跳转到myadmin/user_add_success.html页面。
西门吹雪1997
2019/03/04
8910
Python-Django
一般在urls.py中配置url,在models.py中配置model,在views.py中配置View。
py3study
2020/01/03
7850
基于python开发的口罩供需平台
该项目是基于python的web类库django开发的一套web网站,做为一个公益项目。
西门吹雪1997
2020/03/18
6560
Django源码学习-8-ListView 通用视图-续
Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
小团子
2019/08/06
8950
利用Django通用类视图(class
最近在学习Django,官方文档介绍地十分详细。但是“大而全”就难免会有些不够速成,和我们这个浮躁的互联网时代格格不入,所以我就整理了这个文档。就像coolshell说的,一泡屎的时间就可以看完。
py3study
2020/01/03
1.6K0
django 1.8 官方文档翻译: 3-4-3 使用基于类的视图处理表单
你自己实现这些功能经常导致许多重复的样本代码(参见在视图中使用表单)。为了避免这点,Django 提供一系列的通用的基于类的视图用于表单的处理。
ApacheCN_飞龙
2022/11/27
2.1K0
Django学习笔记 1.4 表单和通用视图
更新一下在上一个教程中编写的投票详细页面的模板 (“polls/detail.html”) ,增加一个 HTML 元素:
twowinter
2020/04/17
8600
django 通用视图(generic view)获取 request
from django.views import generic from blog.models import * from ipware.ip import get_ip class IndexView(generic.ListView): template_name = 'lw-index-noslider.html' # 加载该html文件 context_object_name = "articles" # 是数据库搜索出来的结果存放的变量名字,用于模板循环显示
卓越笔记
2023/02/17
3510
django 入门:通用视图类重构视图
博客:https://www.jianshu.com/p/8cdf099e974f
陈宇明
2020/12/15
9630
django 入门:通用视图类重构视图
在 django generic.DetailView 里设置缓存(重写 get_object )
# ..\Lib\site-packages\django\views\generic\dates.py
卓越笔记
2023/02/18
3270
diango之基于内置视图CBS编程
Class-based views是Django为解决建站过程中的常见的呈现模式而建立的。具有如下几个原则:
菲宇
2019/06/13
7620
基于django的视频点播网站开发-step7-我的收藏喜欢功能
从本讲起,我们会讲到个人菜单中另外两个比较重要的功能,“我的收藏”与“我的喜欢”。感兴趣的同学可以点击网站的右上角,即可弹出个人菜单,你就能看到“我的收藏”与“我的喜欢”了。通过学习这两个功能,我们会加深对django中通用视图类的理解与应用。
西门吹雪1997
2019/02/26
6770
Django REST 框架详解 05 | 视图家族 Mixins
Django REST framework 为了方便视图类的操作,构建了包括以下几种视图类和工具集:
白墨石
2021/01/12
1.2K0
推荐阅读
相关推荐
Django内置的通用类视图及实例
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验