当前位置: 首页 > news >正文

先了解清楚 脏读、不可重复读、幻读,再谈事务隔离机制

 前言

 

在大谈事务隔离机制前,我们务必要了解   脏读、不可重复读、幻读 。
因为事务隔离机制,就是为了给我们选择权利去规避脏读、不可重复读、幻读。
如果我们连问题是什么东西都不清楚,那去了解解决各问题的方案,是不是草率了。

 

所以,该篇内容主要是想用些通俗易懂的话语结合实例去 描述下,

 

什么是脏读?

什么是不可重复读?

什么是幻读?

 

 

 

正文

 

一.什么是脏读?

 

举个例子

我和你的操作分别代表两个不同的事务操作(提交事务才算完成一个事务所做的事情)。
咱们公用一个钱包(共享经济),里面没有钱。

你 执行一个事务操作,往钱包里面放入 30块钱(还未提交) 。

我 执行一个事务操作,查询 钱包里面有30块钱,开心,立刻下订单,点两倍奶茶 。

你 神经兮兮地反悔了,放入 30块钱的事务操作没有提交(或者回滚了)

我 后面没有继续查询钱包的钱了,一直以为里面有30块钱呢, 然后外卖来了, 奶茶是凉的,我也是凉的。

 

文字描述

事务 A 的未提交(还依然缓存)的数据被 事务 B 读走,如果 事务 A 失败回滚,会导致 事务 B 所读取的的数据是错误的。

 

 

二.什么是不可重复读?

 

举个例子

 

我和你的操作分别代表两个不同的事务操作。

咱们公用一个钱包(共享经济),里面有100块钱。

我 执行的事务 操作是,先看一眼钱包里面的钱, 然后跟别人说我的财富是多少多少(直接吹起来了),然后吹完后还看一眼钱包里面的钱(依依不舍)。  (同一个事务里面包含两次查询,两次查询存在间隙)

而你执行 的操作是, 悄咪咪地动了钱包的钱。(修改操作)

 

场景,

我第一次看钱包里面的钱, 是100块, 直接开始自信吹水,我有100块呢,奶茶随便喝。 

我吹的正起劲,你悄咪咪地 取走了钱包里面的 90块。

我吹水吹完了,准备再看一眼钱包的钱,结果发现,咦? 怎么只有10块? 我看多了一个零吗??? 钱包是瘪的,我也是瘪的。

 

文字描述

事务A 中 包含 两次(多次)读取数据值操作, 而事务B 在A的读取操作之间 修改数据,导致事务A 读取的数据存在不一致的混乱情况。

 

 

三.什么是幻读?

 

举个例子

我和你的操作分别代表两个不同的事务操作。

咱们公用一个钱包(共享经济),原本有100块钱,然后买奶茶用了30块,剩下70块。

大家都能看到    这条消费记录 :       买奶茶 使用   30元 ,钱包钱数   -  30 元 。

 

我 执行的事务操作是, 先看一眼 钱包的消费记录,
(心里开始计算总额减去每一条消费记录里面的钱,剩下多少钱)

然后开始吹我们勤俭节约,开始计划剩下的钱怎么用。然后吹完后 还看一眼钱包的消费记录(依依不舍)。 

(同一个事务里面包含两次查询,两次查询存在间隙)

你 执行的事务操作是,悄咪咪地消费了几次,新增了好几条消费记录。(新增/删除)

 

场景,

我第一次看钱包里面的消费记录,只有一条记录,心里神算子附身,直接计算出 100块减去这30块,那还有70块~

开始疯狂吹水,感觉我们很节约,然后还开始计划后续怎么动用这笔巨款,计划表都写好了。

在我在那叭叭叭吹水和写计划表的时候, 你悄咪咪地去消费了几把, 消费记录 -10元; -5元 ; -15元

等我写完,再去留恋一把,看一下消费记录,我人傻了。 不是只有一条数据么? 怎么这么多条???

 

 

 

细细一看,是不是觉得 不可重复读  和 幻读 ,这两个很相似?

确实, 不可重复读 注重的是 数据值; 而 幻读 更注重的是 数据集的数量。

也就是说,不可重复读其实 被影响多是 被 修改操作影响;

而 幻读 其实 被影响多是 被 新增操作影响(删除目前大多数也只是一个flag值了)。

 

 

 

 

Spring事务隔离机制 相比 数据库事务隔离机制其实也就多一个 default 。

事务隔离级别作用的简单描述                     
ISOLATION_DEFAULT使用后端数据库默认的隔离级别
ISOLATION_READ_UNCOMMITTED允许读取尚未提交的更改。可能导致脏读、幻读或不可重复读。
ISOLATION_READ_COMMITTED(Oracle 默认级别)允许从已经提交的并发事务读取。可防止脏读,但幻读和不可重复读仍可能会发生。
ISOLATION_REPEATABLE_READ(MYSQL默认级别)对相同字段的多次读取的结果是一致的,除非数据被当前事务本身改变。可防止脏读和不可重复读,但幻读仍可能发生。
ISOLATION_SERIALIZABLE完全服从ACID的隔离级别,确保不发生脏读、不可重复读和幻影读。这在所有隔离级别中也是最慢的,因为它通常是通过完全锁定当前事务所涉及的数据表来完成的。

 

相关文章:

  • ActiveMQ 启动报错 Address already in use: JVM_Bind 5672
  • ActiveMQ 无法注入 jmsMessagingTemplate
  • ActiveMQ 报错 Could not connect to xxxxxxx , hostname can‘t be null
  • Springboot ActiveMQ 消息重发延迟时间 坑记
  • Springboot 整合 spring batch 实现批处理 ,小白文实例讲解
  • Springboot 使用Jackson 操作 json数据,各场景实例
  • Springboot 整合Websocket+Stomp协议+RabbitMQ做消息代理 实例教程
  • Java 将List<String> 转为以逗号 ‘,’ 拼接的字符串
  • Java 基于原生HttpURLConnection ,调用GET 和 POST请求 工具类
  • Java 识别请求来自移动端还是电脑端
  • MySql 别犯糊涂了! LEFT JOIN 的 ON 后接上筛选条件,多个条件会出事!
  • 微服务 分布式事务解决方案
  • MySql 索引失效、回表解析
  • Springboot 超简单实现在线预览,Word文档 doc、xlsx、pdf、txt等
  • Java 结合实例学会使用 静态代理、JDK动态代理、CGLIB动态代理
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • Android系统模拟器绘制实现概述
  • CentOS 7 修改主机名
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • exports和module.exports
  • gf框架之分页模块(五) - 自定义分页
  • Git 使用集
  • Idea+maven+scala构建包并在spark on yarn 运行
  • js中的正则表达式入门
  • rc-form之最单纯情况
  • Spark RDD学习: aggregate函数
  • vue中实现单选
  • 读懂package.json -- 依赖管理
  • 对象引论
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 如何选择开源的机器学习框架?
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 无服务器化是企业 IT 架构的未来吗?
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • elasticsearch-head插件安装
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 如何正确理解,内页权重高于首页?
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #Linux(Source Insight安装及工程建立)
  • #pragma pack(1)
  • (0)Nginx 功能特性
  • (06)金属布线——为半导体注入生命的连接
  • (4)(4.6) Triducer
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (未解决)macOS matplotlib 中文是方框
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET性能优化(文摘)
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚