Mysql RC/RR隔离原理和区别 不可重复读和可重复读
Mysql RC/RR隔离原理和区别 不可重复读和可重复读
mysql四种隔离级别:
1.未提交读(READ UNCOMMITED)脏读
2.已提交读 (READ COMMITED)简称(RC) 不可重复读
3.可重复读(REPEATABLE READ)简称(RR)
4.可串行化(SERIALIZABLE)
这个不用验证了,所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰了,一般不用,性能特别低。
测试1 ,采用mysql 默认的隔离级别 RR ,启动A、B两个事务对比,阿拉伯数字递增代表事务执行的时间顺序

测试2 ,隔离级别设置为 RC ,启动A、B两个事务对比,阿拉伯数字递增代表事务执行的时间顺序

总结∶
可重复读级别下(RR),开启事务之后第一个select才会生成快照,而不是事务一开始就生成快照。 >> 在一个事务内 本事务未提交之前(外部事务已提交),查询的仍然是上一次该数据快照。而不是最新数据。
读已提交级别下(RC),每次select都会生成一个快照。 >> 在一个事务内 本事务未提交之前(外部事务已提交),查询的是最新数据。
Oracle 默认使用READ COMMITTED(读已提交)隔离级别
MySQL默认使用REPEATABLE(可重复读)隔离级别
以下是测试步骤:
1.mysql客户端SQLyog测试无效,需要通过 MySQL 8.0 Command Line Client客户端来测试。
开启2个MySQL 8.0 Command Line Client客户端
2.数据库默认事务是自动提交模式,查看和修改提交模式
#查看
SELECT @@autocommit;
#关闭自动提交
SET @@autocommit = 0;
#开启自动提交
SET @@autocommit = 1;
-- 查看当前会话的事务隔离级别
SELECT @@transaction_isolation; # REPEATABLE-READ
-- 查看全局的事务隔离级别
SELECT @@GLOBAL.transaction_isolation; # REPEATABLE-READ
修改隔离级别
READ UNCOMMITTED:允许事务读取其他未提交的事务所做的修改。但是,会出现脏读、不可重复读和幻读等问题。
READ COMMITTED:只允许事务读取已经提交的事务所做的修改。在同一个事务内,对同一行数据的查询可能返回不同的结果。
REPEATABLE READ:事务执行期间,保证多次读取同一数据结果一致。但是,可能出现幻读问题。
SERIALIZABLE:最高级别的隔离级别,完全串行化事务执行。确保每个事务对数据库的读写操作是相互独立的。
概念:
并发事务会出现更新丢失、脏读、不可重复读,幻读。
更新丢失:当两个或多个事务更新同一行记录,会产生更新丢失现象。回滚覆盖,一个事务回滚操作,把其他事务已提交的数据给覆盖了;提交覆盖,一个事务提交操作,把其他事务已提交的数据给覆盖了
脏读:一个事务读取到了另一个事务修改但未提交的数据
不可重复读:一个事务读到了另一个事务已经提交的update数据,导致多次查询结果不一致
幻读:在同一个事务中,前后两次查询同一个范围的数据时,发现有新的数据插入,导致结果集不一致的情况。
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
##测试发现需要修改全局才生效
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;
手动控制事务
开启事务:BEGIN; 和 START TRANSACTION; 在功能上是等价的。它们都会开始一个新的事务。
提交事务:COMMIT;
回滚事务:ROLLBACK;
#创建测试表
CREATE TABLE `isolation_level_test` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) DEFAULT NULL,
`age` INT(11) DEFAULT NULL,
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
##初始化1条记录
INSERT INTO `isolation_level_test` (`id`, `name`, `age`, `create_time`) VALUES (1, 'forlan3', 11, '2024-05-29 13:45:11'); # 5
# 对应上面的图示
#窗口1
BEGIN; # 1
SELECT * FROM isolation_level_test; # 3
SELECT * FROM isolation_level_test; # 7
COMMIT; # 8
SELECT * FROM isolation_level_test; # 9
#窗口2
BEGIN; # 2
SELECT * FROM isolation_level_test; # 4
INSERT INTO `isolation_level_test` (`id`, `name`, `age`, `create_time`) VALUES (11, 'forlan3', 12, '2024-05-29 13:45:11'); # 5
COMMIT; # 5
SELECT * FROM isolation_level_test; # 6
## 扩展 SERIALIZABLE 所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰了。
窗口1 在查询的时候,如果窗口2 新增的数据,但是没有提交,窗口1就卡在那里,查询不出结果。只有等窗口2提交或回滚,窗口1才可以查询出来结果。

Mysql RC/RR隔离原理和区别 不可重复读和可重复读的更多相关文章
- mysql数据库事务隔离原理
今天在学习JDBC的时候看到了关于MySQL的事务的隔离级别的问题,感觉内容挺高级的,所以记录一篇文章,以备后面使用. 数据库隔离级别有四种,应用<高性能mysql>一书中的说明: 然后说 ...
- [原创]MySQL RR隔离级别下begin或start transaction开启事务后的可重复读?
Server version: 5.6.21-log MySQL Community Server (GPL) 前提提要: 我们知道MySQL的RR(repeatable read)隔 ...
- Mysql RR隔离更新列没有索引 会锁全表
<pre name="code" class="html">mysql> show variables like '%tx_isolation ...
- mysql事务之一:MySQL数据库事务隔离级别(Transaction Isolation Level)及锁的实现原理
一.数据库隔离级别 数据库隔离级别有四种,应用<高性能mysql>一书中的说明: 然后说说修改事务隔离级别的方法: 1.全局修改,修改mysql.ini配置文件,在最后加上 1 #可选参数 ...
- 再谈mysql锁机制及原理—锁的诠释
加锁是实现数据库并发控制的一个非常重要的技术.当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁.加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更 ...
- 理解MySQL数据库事务-隔离性
Transaction事务是指一个逻辑单元,执行一系列操作的SQL语句. 事务中一组的SQL语句,要么全部执行,要么全部回退.在Oracle数据库中有个名字,叫做transaction ID 在关系型 ...
- MySQL事务和隔离级别
Mysql事务 避免事务,会占用内存 事务是啥? 简而言之:事务 - 就是保护多条执行的sql语句,要么全部成功,要么全部失败 比如:转账就是一个事务:从一个用户将资金转出,再将资金转入到另一个用户, ...
- 【MySQL】MySQL锁和隔离级别浅析一
<MySQL技术内幕InnoDB存储引擎>第一版中对于MySQL的InnoDB引擎锁进行了部分说明,第二版有部分内容更新. 与MySQL自身MyISAM.MSSQL及其他平台BD锁的对比: ...
- Mysql数据库事务隔离级别
事务(transaction)是数据库管理系统的执行单位,可以是一个数据库操作(如Select操作)或者是一组操作序列.事务ACID属性,即原子性(Atomicity).一致性(Consistency ...
- 浅谈MySQL事务及隔离级别
目录 1.什么是事务 2.事务的ACID属性 2-1.原子性(Atomicity) 2-2.一致性(Consistency) 2-3.隔离性(Isolation) 2-4.持久性(Durability ...
随机推荐
- Facebook宕机背后,我们该如何及时发现DNS问题
简介: 国庆期间,Facebook 及其旗下 Instagram 和 WhatsApp 等应用全网宕机,停机时间将近 7 小时 5 分钟,Facebook 市值损失 643 亿美元.针对Facebo ...
- [Trading] 人物: 陈向忠日内交易技术核心 - 趋势形态与成交量
分时图判断趋势(开仓方向) 只要是低点不断抬高的,就是上涨趋势,高点是否提高是其次的. 只要是高点不断降低的那就是下降趋势,假如低点也在不断降低,那么这样的下降趋势就更加完美一些. 很多人就是看对了趋 ...
- [SVG] JS 动态加载 svg 修改 svg 属性
svg 概念一览: https://javascript.ruanyifeng.com/htmlapi/svg.html加载 svg: // for example: $('body').load(' ...
- cs61a回顾
从1月25开始到2.20,完成第一个项目hog. 总结让自己进度慢的主观因素: 妄图一次阅读掌握所有知识:违反了<为什么学生不喜欢上学>中大脑不是用来思考的,它的真正作用在于使你避免思考的 ...
- GtkSharp 设置窗口背景透明
本文告诉大家如何在 GTK Sharp 里面设置窗口背景透明 在 GTK 里面设置窗口背景透明十分简单,只需使用如下代码即可 this.AppPaintable = true; var screen ...
- dotnet 读 WPF 源代码笔记 聊聊 HwndWrapper.GetGCMemMessage 调试消息
我在阅读 WPF 源代码,在 HwndWrapper 的静态构造函数看到了申请了 HwndWrapper.GetGCMemMessage 这个 Windows 消息,好奇这个消息是什么功能的.通过阅读 ...
- ASP.NET Core 将文件夹内容输出为压缩包文件方法
本文主要是告诉大家一个省内存的方法,将整个文件夹的内容作为一个压缩包输出,但是实际上没有申请那么多的内存,也不需要升级创建一个压缩包文件.原理是通过逐个读文件然后按照压缩包格式输出 在每个请求的方法可 ...
- go语言package使用
近期接触go感觉package包之间引用很麻烦,很绕圈子.下面一起理一理这个package咋用 关于package: 1.不限于一个文件,可以多个文件组成一个package 2.不要求package的 ...
- C语言程序设计-笔记04-函数
C语言程序设计-笔记04-函数 例5-1 计算圆柱体的体积.输入圆柱的高和半径,求圆柱体积volume=πxr^2xh.要求定义和调用函数cylinder(r,h)计算圆柱体的体积. #includ ...
- SpringBoot获取配置:@Value、@ConfigurationProperties方式
配置文件yml # phantomjs的位置地址 phantomjs: binPath: windows: binPath-win linux: binPath-linux jsPath: windo ...