最近在了解了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解决不可重复读相关推荐

  1. MYSQL的REPEATABLE-READ解决不可重复读和幻读

    做了一个实验 create table t (id number, mount number); insert into t value(1,1);   A B 1 begin;   2 select ...

  2. 一图看懂MVCC机制,RC级别解决脏读问题,RR级别怎么解决不可重复读问题【MySQL系列】

    说起事务隔离级别和各自解决的问题,相信学过MySQL的人都倒背如流, 三类问题:脏读.不可重复读.幻读问题: 四种隔离级别: 读不提交,最低的隔离级别,存在脏读.不可重复读.幻读问题: 读已提交,能解 ...

  3. mysql解决不可重复读_mysql怎么解决不可重复读

    mysql解决不可重复读的方法:采用了mvcc多版本并发控制,mvcc是利用在每条数据后面加了隐藏的两列,即创建版本号和删除版本号,每个事务在开始的时候都会有一个递增的版本号. [相关学习推荐:mys ...

  4. mysql防止不可重复读_mysql怎么解决不可重复读

    mysql解决不可重复读的方法:采用了mvcc多版本并发控制,mvcc是利用在每条数据后面加了隐藏的两列,即创建版本号和删除版本号,每个事务在开始的时候都会有一个递增的版本号. [相关学习推荐: my ...

  5. 如何验证 MySQL 的 InnoDB 在可重复读下依然会有幻影行问题及其原因

    如何验证 MySQL 的 InnoDB 在可重复读下依然会有幻影行问题及其原因 验证的流程 自助验证 为什么 MySQL 的 InnoDB 在可重复读下依然会有幻影行问题   很多人都知道,MySQL ...

  6. MySQL 幻读和不可重复读的区别

    背景 最近在学习 MySQL 的事务,幻读和不可重复读很容易搞混.故做此记录总结.先给出两者的定义. 不可重复读 如果一个事务修改了另一个未提交事务读取的数据,就意味着发生了不可重复读现象. r1[x ...

  7. 简单聊聊mysql的脏读、不可重复读、幻读

    最近,在一次 mysql 死锁的生产事故中,我发现,关于 mysql 的锁.事务等等,我所知道的东西太碎了,所以,我试着用几个例子将它们串起来.具体做法就是通过不断地问问题.回答问题,再加上" ...

  8. mysql 快照读 幻读,InnoDB的MVCC如何解决不可重复读和快照读的幻读,当前读用next-key解决幻读...

    InnoDB默认的隔离级别是RR(可重复读),可以解决脏读和不可重复读,只解决了快照读情况下的幻读问题,当前读情况下解决幻读问题得靠next-key锁. mysql如何实现避免幻读: 在快照读读情况下 ...

  9. mysql幻读和不可重复读的区别_面试官:MySQL的可重复读级别能解决幻读吗

    Java面试笔试面经.Java技术每天学习一点 Java面试 关注不迷路 作者:宁愿. 来源:https://juejin.im/post/5c9040e95188252d92095a9e 引言 之前 ...

最新文章

  1. 高通与苹果宣布“复合”,英特尔黯然退场 | 极客头条
  2. 从上到下打印二叉树1
  3. 2021年回顾与展望
  4. How is new Appoinment id generated in my task followup scenario
  5. 【2019牛客暑期多校训练营(第二场)- F】Partition problem(dfs,均摊时间优化)
  6. 43个PSD to XHTML,CSS教程
  7. C++ 进阶——object slicing 与虚函数与dynamic_cast
  8. linux切换软件版本,使用Linux的alternatives命令替换选择软件的版本方法
  9. 使用vue -cli脚手架构建项目组件的全局注册与本地注册
  10. 【第三十一期】360后台开发实习面经 - 两轮技术面
  11. 20162327WJH实验五——数据结构综合应用
  12. PWM/转速单闭环/转速电流双闭环电机控制Simulink仿真
  13. 图库类小程序服务器配置,小程序生成图片库
  14. findContours函数详细解析
  15. [imx8mpevk] pcie endpoint test
  16. Failed at step EXEC spawning /var/xxx/xxx-1.0-SNAPSHOT.jar: Text file busy
  17. 免费顶级域名+github个人主页教程
  18. 数据结构记录--散列法实验
  19. 33-UITableView—微博实例
  20. 环保用电监管云平台在助力实现大气污染源工况用电在线监测——安科瑞 严新亚

热门文章

  1. 360悬浮加速小火箭,内存清理,加速缓存
  2. Flutter 实现切角渐变矩形
  3. java 正斜杠与反斜杠之分
  4. 2021年起重机械指挥考试题及起重机械指挥模拟考试
  5. 【从饮水机到名人堂之c语言】操作符详解(1)
  6. 云帆大数据学院_hadoop 2.2.0源码编译
  7. 哈工大李治军老师操作系统笔记【10】:内核级线程实现(Learning OS Concepts By Coding Them !)
  8. [转]奇文-闲话操作系统(2/4)
  9. 针对初创型企业的高新企业认定知识及建议!
  10. ELK+zabbix+ding talk对日志实时监控报警