数据库系列:RR和RC下,快照读的区别
数据库系列:MySQL慢查询分析和性能优化
数据库系列:MySQL索引优化总结(综合版)
数据库系列:高并发下的数据字段变更
数据库系列:覆盖索引和规避回表
数据库系列:数据库高可用及无损扩容
数据库系列:使用高区分度索引列提升性能
数据库系列:前缀索引和索引长度的取舍
数据库系列:MySQL引擎MyISAM和InnoDB的比较
数据库系列:InnoDB下实现高并发控制
数据库系列:事务的4种隔离级别
1 介绍
上一篇,我们介绍了 SQL92标准中事务的四种隔离级别,并讨论了每种隔离级别下 脏读、不可重复读、幻读 问题是否可以解决:
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| 读未提交:Read Uncommitted | × | ||
| 读已提交:Read Committed | × | × | |
| 可重复读:Repeatable Read | × | × | |
| 串行化:Serializable | × | × | × |
在 读已提交(Read Committed) 和 可重复读(Repeatable Read)两种隔离级别上,数据库底层采用了快照读(Snapshot Read)的模式来实现高并发机制。
那RC 和 RR这两种的隔离级别上的快照读(Snapshot Read)有什么区别呢,咱们往下探索?
2 RC 和 RR下快照读的区别
2.1 啥是快照读?
MySQL中InnoDB存储引擎的快照读(Snapshot Read)是一种读取数据的方式,它可以在事务开始时创建一个数据快照,这个快照是一致性的,即读取在事务开始时或特定时间点之前提交的数据。底层原理是MySQL使用多版本并发控制(MVCC)机制来实现快照读。在MVCC中,每个事务读取的数据都是根据事务开始时间点或快照时间点确定的。MySQL通过为每一行数据添加版本信息(如创建版本、删除版本等),来保留历史数据的多个版本。通过一种不加锁一致性读(Consistent Nonlocking Read)的方式来实现高并发的能力。
2.2 RU和Serializable为啥不采用快照读?
- Serializable是串行化执行,每个步骤都是顺序的,一项事务执行完成才能执行另一项事务,所以没有MVCC 多版本的必要。
- RU是读未提交,所有未完成的、未最终提交事务都可以被读取到,所以任何有变化的数据都会被读取到,即使是还没有Commit,也没有多版本的必要了。
2.3 读已提交(Read Committed)
- 事务隔离级别的一种,简称RC
- 解决了“脏读”问题,保证读取到的所有都是已提交事务的,并最终落库的
- 可能存在“读幻影行”问题,同一个事务中,前后连续的select可能读到不同的结果集
2.4 可重复读(Repeated Read)
- 事务隔离级别的一种,简称RR
- 它不仅解决“脏读”问题,还解决了“读幻影行”的问题,同一个事务里,前后连续的select读到始终相同的结果集
2.5 不同隔离级别下快照读的区别
2.5.1 案例解析1
事务执行顺序如下:
| 时间序列 | A事务 | B事务 |
|---|---|---|
| T1 | 开始事务 | |
| T2 | 开始事务 | |
| T3 | 查询xx账户余额(假设默认有500元)★SELECT balance FROM acount WHERE customer_id=123456; |
|
| T4 | xx账户存入1000元(未提交)★UPDATE acount SET balance=balance+1000.00 WHERE customer_id=123456; |
|
| T5 | 查询A账户余额 | |
| T6 | 提交事务★commit; |
|
| T7 | 查询A账户余额 |
Repeated Read 隔离级别
- T3读到的结果肯定是500,这是B事务的第一个read
- T5读到的结果也是500,因为A事务还没有提交
- T7读到的结果还是500,因为A事务是在时间T5之后提交的,T7读到和T5一样的结果(重复读)
Read Committed 隔离级别
- T3读到的结果肯定是500,这是B事务的第一个read
- T5读到的结果也是500,因为A事务还没有提交
- T7读到的结果还是1500,因为A事务已经提交,T7读到Commit后的结果(读已提交)
2.5.2 案例解析2
事务执行顺序如下:
| 时间序列 | A事务 | B事务 |
|---|---|---|
| T1 | 开始事务(假设默认有500元) | |
| T2 | 开始事务 | |
| T3 | xx账户存入1000元(未提交)★UPDATE acount SET balance=balance+1000.00 WHERE customer_id=123456; |
|
| T4 | 提交事务★commit; |
|
| T5 | 查询A账户余额★SELECT balance FROM acount WHERE customer_id=123456; |
- Repeated Read 隔离级别:唯一的一次读是在A事务提交之后的读,所以结果肯定是1500
- Read Committed 隔离级别:读取已提交之后的数据,所以毫无疑问依然是1500
2.6 区别总结
首先,事务总能够读取到自己写入(update /insert /delete)的行记录。而其他事务的提交,则分情况。
RC模式,快照读总是能读到最新的行数据快照,当然,必须是已提交事务写入的。
RR模式,某个事务首次read记录的时间为T1,之后的操作不会读取到T1时间之后已提交事务写入的记录,以保证连续相同的read读到相同的结果集。
简单点说:
- RR下,事务在第一个Read操作时,会建立Read View,并贯穿整个事务的过程,保证了可重复读的效果。
- RC下,事务在每次Read操作时,都会建立Read View,以保证获取到的都是数据库中最新的被Commit的值。
数据库系列:RR和RC下,快照读的区别的更多相关文章
- RR 和RC 幻读问题
<pre name="code" class="html">显然 RR 支持 gap lock(next-key lock),而RC则没有gap l ...
- mysql rr和rc区别
<pre name="code" class="html">1. 数据库事务ACID特性 数据库事务的4个特性: 原子性(Atomic): 事务中的 ...
- mysql RC下不存在则插入
mysql版本:5.7 目的:在RC下,name列上仅有key索引,并发插入name时不出现重复数据 RC不加gap lock,并且复合select语句是不加锁的快照读,导致两个事务同时进行都可插入, ...
- mysql 快照读MVCC
mysql的读分快照读和当前读 快照读 是指写的同时,读不阻塞,达到并发的作用 这时候的读 是 记录的历史版本,存在于undo里,当然回滚时就的也是这个undo 当执行一条update语句时,记录本身 ...
- InnoDB MVCC RR隔离级别下的数据可见性总结
一.背景 熟悉数据库隔离级别的人都知道,在RR(可重复读)隔离级别下,无论何时多次执行相同的SELECT快照读语句,得到的结果集都是完全一样的,即便两次SELECT语句执行期间,其他事务已经改变了该查 ...
- mysql并发控制之快照读和当前读
上一篇简单的介绍了下MVCC(多版本并发控制)的原理,MVCC会对事物内操作的数据做多版本控制,从而实现并发环境下事物对数据写操作的阻塞不影响读操作的性能.而这个多版本控制的实现是由undo log来 ...
- MySQL--事务隔离级别RR和RC的异同
在MySQL中,事务隔离级别RC(read commit)和RR(repeatable read)两种事务隔离级别基于多版本并发控制MVCC(multi-version concurrency con ...
- RR和RC复合语句加锁
mysql版本:5.7 RR复合语句: insert/update/delete+select,+号左边是影响数据的排他锁,+号右边是查询(当前读,其实相当于lock in share mode)到数 ...
- MySQL——一致性非锁定读(快照读)&MVCC
MySQL--一致性非锁定读(快照读) MySQL数据库中读分为一致性非锁定读.一致性锁定读 一致性非锁定读(快照读),普通的SELECT,通过多版本并发控制(MVCC)实现. 一致性锁定读(当前读) ...
- Windows平台下的读写锁
Windows平台下的读写锁简单介绍Windows平台下的读写锁以及实现.背景介绍Windows在Vista 和 Server2008以后才开始提供读写锁API,即SRW系列函数(Initialize ...
随机推荐
- react中常见hook的使用方式与区别
1.什么是hook?react hook是react 16.8推出的方法,能够让函数式组件像类式组件一样拥有state.ref.生命周期等属性. 2.为什么要出现hook?函数式组件是全局当中一个普通 ...
- uniapp 只选择月份与日的时间选择器
1.使用 <picker> 组件的 mode 属性设置为 "multiSelector",然后通过设置 range 属性来提供可选的月份和日的列表. <templ ...
- 如何破解wifi密码?
前期准备: kali 系统 外置无线网卡 破解过程: 首先,需要登录kali系统,可以是虚拟机. 在虚拟机中设置点击 虚拟机-可移动设备-无线网卡的名称,将无线网卡绑定到kali虚拟机上. 在kali ...
- CF939F Cutlet 题解
题意简述 有一个正反面都为 \(0\) 的卡片,每过 \(1\) 分朝下那一面的数值就会增加 \(1\),你可以在几个区间的时间内翻转卡片,求经过 \(2n\) 秒后能否让这个卡片的正反面的数都为 \ ...
- 【LaTeX】语法(更新中)
目录 长度 空行 空格 超链接 数学公式 段落中(隐式) 单独成段(显式) 居中,左对齐,右对齐 居中 左对齐 右对齐 参考文献配置 TODO 参考资料 中文支持参考环境配置中的 内容,在这里不做重复 ...
- 微服务下使用maven做多环境配置
分享技术,用心生活 前言:很多项目在开发,提测,上线时都会提前手动改一些配置文件来适应对应环境,麻烦不说了,而且也容易出错:生产环境的配置也容易暴露.基于此,我们基于spring cloud alib ...
- Web服务器部署上线的踩坑流程回顾与知新
5月份时曾部署上线了C++的Web服务器,温故而知新,本篇文章梳理总结一下部署流程知识: 最初的解决方案:https://blog.csdn.net/BinBinCome/article/detail ...
- WPF 自定义窗体(一)
.Net默认的窗体样式只有四种:None.SingleBorderWindow.ThreeDBorderWindow.ToolWindow,都比较"丑".而很多时候,我们希望自定义 ...
- BeanUtils.copyProperties:曾经是我的女神,现在是我的毒药。
前言 BeanUtils.copyProperties十有八九是你这些年工作中用的很多的其中一个,不管是Apache的还是Spring的. 网上的解释浩如烟海,我这边用一个超简单的例子直观展示给你看. ...
- 2022最新 Navicat Premium 16中文软件激活安装永久使用正版(支持MAC+win)
Navicat Premium 16中文正版永久使用,下载地址: 关注我的wx公众号"奋斗在IT"回复1015获取下载地址