在了解脏读,不可重复度,幻读之前,首先要明白这三种情况的出现都是和数据库并发事务有关联的,如果所有的读写都按照队列的形式进行,就不会出现问题。

名词解析和解决方案

脏读

脏读又称无效数据读出(读出了脏数据)。一个事务读取另外一个事务还没有提交的数据叫脏读。

例如:事务T1修改了某个表中的一行数据,但是还没有提交,这时候事务T2读取了被事务T1修改后的数据,之后事务T1因为某种原因回滚(Rollback)了,那么事务T2读取的数据就是脏的(无效的)。

解决办法:把数据库的事务隔离级别调整到READ_COMMITTED(读提交/不可重复读)

不可重复读

不可重复读是指在同一个事务内,两次相同的查询返回了不同的结果。

例如:事务T1会读取两次数据,在第一次读取某一条数据后,事务T2修改了该数据并提交了事务,T1此时再次读取该数据,两次读取便得到了不同的结果。

解决办法:把数据库的事务隔离级别调整到REPEATABLE_READ(可重复读)

幻读

幻读也是指当事务不独立执行时,插入或者删除另一个事务当前影响的数据而发生的一种类似幻觉的现象。

例如:系统事务A将数据库中所有数据都删除的时候,但是事务B就在这个时候新插入了一条记录,当事务A删除结束后发现还有一条数据,就好像发生了幻觉一样。这就叫幻读。

解决办法:把数据库的事务隔离级别调整到SERIALIZABLE_READ(序列化执行),或者数据库使用者自己进行加锁来保证。

题外话:

不可重复读出现多是因为修改;幻读重点是新增、删除。mysql中的REPEATABLE_READ模式引入了间隙锁(GAP),解决了幻读的问题。不论是什么方式解决幻读,都会付出一定代价的性能让步。所以说在业务需求和技术方案之间权衡也是技术人员最需要掌握得技能之一。

脏读,不可重复读,幻读区别和避免相关推荐

  1. 脏读,不可重复读,幻读区别

    脏读 脏读又称无效数据读出.一个事务读取另外一个事务还没有提交的数据叫脏读. 例如:事务T1修改了一行数据,但是还没有提交,这时候事务T2读取了被事务T1修改后的数据,之后事务T1因为某种原因Roll ...

  2. mysql 脏读 不可重复读 幻读_mysql事务隔离级别/脏读/不可重复读/幻读详解

    一.四种事务隔离级别 1.1read uncommitted 读未提交 即:事务A可以读取到事务B已修改但未提交的数据. 除非是文章阅读量,每次+1这种无关痛痒的场景,一般业务系统没有人会使用该事务隔 ...

  3. mysql不可重复读和重复读_MySql隔离级别:RU / RC / RR / S + 脏读 / 不可重复读 / 幻读 / 可重复读...

    MySQL 事务 本文所说的 MySQL 事务都是指在 InnoDB 引擎下,MyISAM 引擎是不支持事务的. 数据库事务指的是一组数据操作,事务内的操作要么就是全部成功,要么就是全部失败,什么都不 ...

  4. oracle 脏读,脏读 不可重复读 幻读

    序言 脏读.不可重复读.幻读这几个概念开始接触和学习的时候是在大学学习数据库系统的时候,那时候对这几个专业名词的理解停留在概念文字上,并没有真正使用过实践中,最近工作中涉及到这几个概念方面的知识,就来 ...

  5. mysql 虚读幻读区别_MySQL脏读、虚读、幻读

    事务的特性: 原子性:指处于同一个事务中的多条语句是不可分割的. 一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态.比如转账,转账前两个账户余额之和为2k,转账之后也应该是2K. 隔离 ...

  6. mysql 可重复读和读提交的区别

    事务的四种隔离级别 未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据 提交读(Read Committed):只能读取到已经提交的数据.Oracl ...

  7. Mysql如何实现隔离级别 - 可重复读和读提交 源码分析

    Abstract 本文会(1) 演示Mysql的两种隔离级别.  (2) 跟着mysql的源代码来看看它是怎么实现这两种隔离级别的. Mysql的隔离级别 当有多个事务并发执行时, 我们需要考虑他们之 ...

  8. MySQL可重复读和读已提交实现原理,深入理解MVCC。

    1.隔离级别 MySQL中隔离级别分为4种,提未交读.读已提交.可重复读.串行化.同时MySQL默认隔离级别为可重复读. 图片 查看MySQL隔离级别 SELECT @@tx_isolation 设置 ...

  9. 三分钟了解MVCC(InnoDB如何实现可重复读和读已提交)

    快照读和当前读 快照读 快照读是指读取数据时不是读取最新版本的数据,而是基于历史版本读取的一个快照信息(mysql读取undo log历史版本) , 快照读可以使普通的SELECT 读取数据时不用对表 ...

最新文章

  1. 多分类任务的混淆矩阵
  2. ActionResult 返回类型
  3. 给力!神策数据创新推出数字化运营闭环解决方案!
  4. Flink 能够改写成 FlinkSQL的理论依据:命令式代码 vs 声明式代码
  5. python字典排序及字典集合去重高阶教程
  6. springboot整合minio最新版
  7. nonlocal python3_Python 中的 global、nonlocal 辨析
  8. 如何从字典中随机选择一个键
  9. SAP License:CO第一夜-成本要素会计
  10. [状压dp] 洛谷 P1879 玉米田
  11. 把C++语言的书读薄
  12. 有 4 件事,我很后悔
  13. 芝诺数据高校产学研用成果展示|携程酒店(北京)数据分析报告
  14. 监听settings
  15. 深度学习和目标检测系列教程 20-300:OpenCV与图像处理:霍夫变换技术实现直线检测
  16. 各大搜索引擎网站收录提交入口
  17. 西澳大学诚招计算机视觉/机器学习方向博士研究生
  18. Moodle3.8计划任务配置详解
  19. 程序员必备软件清单,没时间解释了,快上车
  20. MybatisPlus基本查询

热门文章

  1. python绘制樱花洒落_Python画图之浪漫樱花
  2. 设计 Pastebin.com (或者 Bit.ly)
  3. 李彦宏董事会怒摔手机!!
  4. Musical Composition Style Transfer via Disentangled Timbre Representations论文阅读
  5. 往Oracel数据库批量插入数据
  6. exsi虚拟机模板导出和基于模板创建虚拟机
  7. azure的虚拟机怎么选_Windows Azure案例: 选虚拟机或云服务
  8. 没有token 且访问的不是 登录页 就直接拦截到登录(路由守卫)
  9. WPF中,Combox的SelectedItem属性绑定成功后,未能默认显示上一次选择的结果。
  10. 中关村软件园机房项目进度汇报