mysql中mvcc解决不可重复读
最近在了解了mysql中事务的隔离级别,记录一下
事务的隔离级别:
隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交 read-uncommitted | 是 | 是 | 是 |
读已提交 read-committed | 否 | 是 | 是 |
可重复读 repeatable-read | 否 | 否 | 是 |
串行化 serializable | 否 | 否 | 否 |
脏读:事务A读取了事务B提交的数据,但是B事务由于某种原因导致事务回滚,但是A读取的仍然是事务B回滚之前的数据
不可重复读:事务A读取了一条数据,这时事务B将该条数据修改,事务A再次读取该条数据时,和最开始读取的数据不一致
幻读:事务A读取了一批数据,例如select * from user where age =10;读取出了5调数据。这时事务B又向user表插入了一条数据
insert into user(age)values(10)。事务A再次查询时,会发现多了一条数据,这就是幻读。
不可重复读和幻读的区别(个人理解):
不可重复读:针对于修改同一条数据,会出现前后不一致的情况。解决方式为添加行锁
幻读:针对于一批数据,主要体现在新增和删除操作。解决幻读需要锁整张表
mysql中,默认的事务隔离级别是可重复读(repeatable-read),为了解决不可重复读,innodb采用了mvcc(多版本并发控制)来解决这一问题。
mvcc是利用在每条数据后面加了隐藏的两列(创建版本号和删除版本号),每个事务在开始的时候都会有一个递增的版本号
新增:insert into user (id,name,age)values(1,"张三",10);
id | name | age | create_version | delete_version |
1 | 张三 | 10 | 1 |
更新:update user set age = 11 where id = 1;
更新操作采用delete+add的方式来实现,首先将当前数据标志为删除
id | name | age | create_version | delete_version |
1 | 张三 | 10 | 1 | 2 |
然后新增一条新的数据:
id | name | age | create_version | delete_version |
1 | 张三 | 10 | 1 | 2 |
1 | 张三 | 11 | 2 |
删除:删除操作是直接将数据的删除版本号更新为当前事务的版本号
delete from user where id = 1;
id | name | age | create_version | delete_version |
1 | 张三 | 11 | 2 | 3 |
查询操作:
select * from user where id = 1;
查询操作为了避免查询到旧数据或已经被其他事务更改过的数据,需要满足如下条件:
1、查询时当前事务的版本号需要大于或等于创建版本号
2、查询时当前事务的版本号需要小于删除的版本号
即:create_version <= current_version < delete_version
这样就可以避免查询到其他事务修改的数据
mysql中mvcc解决不可重复读相关推荐
- MYSQL的REPEATABLE-READ解决不可重复读和幻读
做了一个实验 create table t (id number, mount number); insert into t value(1,1); A B 1 begin; 2 select ...
- 一图看懂MVCC机制,RC级别解决脏读问题,RR级别怎么解决不可重复读问题【MySQL系列】
说起事务隔离级别和各自解决的问题,相信学过MySQL的人都倒背如流, 三类问题:脏读.不可重复读.幻读问题: 四种隔离级别: 读不提交,最低的隔离级别,存在脏读.不可重复读.幻读问题: 读已提交,能解 ...
- mysql解决不可重复读_mysql怎么解决不可重复读
mysql解决不可重复读的方法:采用了mvcc多版本并发控制,mvcc是利用在每条数据后面加了隐藏的两列,即创建版本号和删除版本号,每个事务在开始的时候都会有一个递增的版本号. [相关学习推荐:mys ...
- mysql防止不可重复读_mysql怎么解决不可重复读
mysql解决不可重复读的方法:采用了mvcc多版本并发控制,mvcc是利用在每条数据后面加了隐藏的两列,即创建版本号和删除版本号,每个事务在开始的时候都会有一个递增的版本号. [相关学习推荐: my ...
- 如何验证 MySQL 的 InnoDB 在可重复读下依然会有幻影行问题及其原因
如何验证 MySQL 的 InnoDB 在可重复读下依然会有幻影行问题及其原因 验证的流程 自助验证 为什么 MySQL 的 InnoDB 在可重复读下依然会有幻影行问题 很多人都知道,MySQL ...
- MySQL 幻读和不可重复读的区别
背景 最近在学习 MySQL 的事务,幻读和不可重复读很容易搞混.故做此记录总结.先给出两者的定义. 不可重复读 如果一个事务修改了另一个未提交事务读取的数据,就意味着发生了不可重复读现象. r1[x ...
- 简单聊聊mysql的脏读、不可重复读、幻读
最近,在一次 mysql 死锁的生产事故中,我发现,关于 mysql 的锁.事务等等,我所知道的东西太碎了,所以,我试着用几个例子将它们串起来.具体做法就是通过不断地问问题.回答问题,再加上" ...
- mysql 快照读 幻读,InnoDB的MVCC如何解决不可重复读和快照读的幻读,当前读用next-key解决幻读...
InnoDB默认的隔离级别是RR(可重复读),可以解决脏读和不可重复读,只解决了快照读情况下的幻读问题,当前读情况下解决幻读问题得靠next-key锁. mysql如何实现避免幻读: 在快照读读情况下 ...
- mysql幻读和不可重复读的区别_面试官:MySQL的可重复读级别能解决幻读吗
Java面试笔试面经.Java技术每天学习一点 Java面试 关注不迷路 作者:宁愿. 来源:https://juejin.im/post/5c9040e95188252d92095a9e 引言 之前 ...
最新文章
- 高通与苹果宣布“复合”,英特尔黯然退场 | 极客头条
- 从上到下打印二叉树1
- 2021年回顾与展望
- How is new Appoinment id generated in my task followup scenario
- 【2019牛客暑期多校训练营(第二场)- F】Partition problem(dfs,均摊时间优化)
- 43个PSD to XHTML,CSS教程
- C++ 进阶——object slicing 与虚函数与dynamic_cast
- linux切换软件版本,使用Linux的alternatives命令替换选择软件的版本方法
- 使用vue -cli脚手架构建项目组件的全局注册与本地注册
- 【第三十一期】360后台开发实习面经 - 两轮技术面
- 20162327WJH实验五——数据结构综合应用
- PWM/转速单闭环/转速电流双闭环电机控制Simulink仿真
- 图库类小程序服务器配置,小程序生成图片库
- findContours函数详细解析
- [imx8mpevk] pcie endpoint test
- Failed at step EXEC spawning /var/xxx/xxx-1.0-SNAPSHOT.jar: Text file busy
- 免费顶级域名+github个人主页教程
- 数据结构记录--散列法实验
- 33-UITableView—微博实例
- 环保用电监管云平台在助力实现大气污染源工况用电在线监测——安科瑞 严新亚
热门文章
- 360悬浮加速小火箭,内存清理,加速缓存
- Flutter 实现切角渐变矩形
- java 正斜杠与反斜杠之分
- 2021年起重机械指挥考试题及起重机械指挥模拟考试
- 【从饮水机到名人堂之c语言】操作符详解(1)
- 云帆大数据学院_hadoop 2.2.0源码编译
- 哈工大李治军老师操作系统笔记【10】:内核级线程实现(Learning OS Concepts By Coding Them !)
- [转]奇文-闲话操作系统(2/4)
- 针对初创型企业的高新企业认定知识及建议!
- ELK+zabbix+ding talk对日志实时监控报警