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 ...
随机推荐
- 基于MaxCompute SQL 的半结构化数据处理实践
简介: MaxCompute作为企业级数据仓库服务,集中存储和管理企业数据资产.面向数据应用处理和分析数据,将数据转换为业务洞察.通过与阿里云内.外部服务灵活组合,可构建丰富的数据应用.全托管的数据 ...
- vscode 配置c/c++环境,无法生成 *.exe文件
[问题]: 使用vscode配置c/c++环境时,提示无法构建失败. [解决方案]: 1. 当前结合网上找的资料已经检查过,tasks.json和launch.json文件,并无配置错误. 2. ...
- 前端如何操作动态渲染的多个checkbox列表单选
input[type=checkbox]:after{ content:""; display:inline-block; width:16px; ...
- Critical Expression
什么是Critical Expression 所谓Critical Expression就是一个表达式依赖的值,必须出现在这个表达式前面.比如: times (label-$) db 0 ;times ...
- VueJS和Javascript实现文字上下滚动效果
一提到文字上下滚动,我们就会想到用不同的程序去实现,而且页面中有文字滚动会增加这个网页的互动和可信度. 1.Js最简单的方法是控制盒子的高度,使不断的重复添加 <html> <bod ...
- VS Code侧边栏的“资源管理器”丢了
选择"查看"下的"命令面板" 输入:View: Reset View Locations 所有的视图会恢复到默认的位置.
- WPF 稳定的全屏化窗口方法
本文来告诉大家在 WPF 中,设置窗口全屏化的一个稳定的设置方法.在设置窗口全屏的时候,经常遇到的问题就是应用程序虽然设置最大化加无边框,但是此方式经常会有任务栏冒出来,或者说窗口没有贴屏幕的边.本文 ...
- 带有声音/音频的 Mac 远程桌面
一言以蔽之:如果你用远程桌面软件访问mac电脑遇到声音问题,改用Splashtop就好了.Splashtop对于Mac 的远程桌面支持非常棒. 尽管有几种远程桌面工具可提供对 Mac 的远程访问,但许 ...
- JDK源码阅读-------自学笔记(三)(java.lang.String String用法和描述浅析)
一.源码特点 final约束,使得String不能被继承,内部其他也不能被继承 String用来表示字符串,或字符序列,序列即为数组 内建数组private final char value[];但是 ...
- 【U8】 生产订单下bom 提示 “遇到以0做除数错误”错误
一个虚拟件子件的子件为无换算率存货,bom中对应的换算率.辅助基本用量为0,修改为null后正常. 对应 bom_opcomponent表的 ChangeRate 换算率 AuxBaseQtyN 辅助 ...