Mysql引擎innodb的脏读,不可重复读,幻读问题

2023-05-16

脏读

概念

脏数据是指事务对缓冲池中行记录的修改,并且还没有被提交,就可能造成另一个事务读取到了另一个事务未提交的数据,违反了数据库的隔离性。

脏数据的读取

示例:

上面示例的隔离级别换成了READ UNCOMMITTED,因此在会话A还没有提交的情况下,会话B就读到了,两次读取得到了不一样的结果,违反了事务隔离性。

但脏读的发生条件是事务的隔离级别是READ UMCOMMITTED,而mysql innodb的默认隔离级别是REPEATABEL READ,Microsoft SQL Server数据库为READ COMMITTED,Oracle数据库同样是READ COMMITTED。

mysql的事务隔离级别如下:

show variables like 'transaction_isolation%';

Mysql 8查看并修改事务隔离级别

不可重复读

概念

不可重复读是指在一个事务内多次读取一个集合数据,这个事务还没有结束时,另外一个事务对这个集合数据做了DML操作,因此第一个事务中的两次读取数据之间,由于第二个事务的操作,造成了两次数据不一样,这种情况称为不可重复读。

不可重复读和脏读的区别是:脏读是读取未提交的数据,不可重复读是读取到已提交的数据,但违反了数据库事务一致性的要求。

示例

示例中,会话A开启一个事务读取数据,读到一条数据,此时会话B插入了一条数据,并且提交了,随后会话A又进行了一次读取数据,读到两条,造成会话A两次读取数据记录不一致。

这个例子的前提是,事务隔离级别是READ COMMITTED。

一般来说,不可重复读是可以接受的,因为读取到的是已经提交的数据,本身不会带来很大问题,因此很多数据库都设置成READ COMMITTED隔离级别.

在innodb存储引擎中,使用next-key lock算法避免了不可重复读的问题。在mysql官方文档中将不可重复读的问题定义为Phantom problem,即幻象问题。在next-key lock 算法下,对索引的扫描,不仅锁住扫描到的索引,而且还锁住这些索引覆盖的范围。因此这个范围内都是不允许插入的。这样避免了另外的事务在这个范围内插入数据导致不可重复读的问题。因此innodb中默认事务隔离级别是READ REPEATABLE,采用next-key lock算法,避免了不可重复读的现象。

幻读

概念

指同一个事务内多次查询返回的结果集不一样(比如增加了或者减少了行记录)。比如在同一个事务A内,第一次查询时候有n条记录,但是第二次同等条件下查询却又n+1条记,这就好像产生了幻觉。

幻读是不可重复读的一种特殊场景。

上面不可重复读的例子也是一种幻读的场景,幻读可以通过gap lock解决。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mysql引擎innodb的脏读,不可重复读,幻读问题 的相关文章

随机推荐

  • MySQL主从状态检查

    1 查看A B数据库同步状态 输入以下命令 xff0c 会出来很多信息 xff0c 但是主要看Slave IO Running与Slave SQL Running这两个字段都显示yes就行了 MySQL span class token o
  • linux 下对CPU压测的两种方法

    常用的对CPU进行压测是通过计算圆周率让CPU高负荷运作 xff0c 以达到考验CPU计算能力与稳定性的目的 下面介绍两种对CPU进行压测的方法 xff1a 第一种 xff1a bc计算圆周率 root span class hljs va
  • 共生矩阵

    cooc feature image Regions Image LdGray Direction Energy Correlation Homogeneity Contrast Regions xff1a 要计算的区域 image xff
  • Linux驱动学习--android声卡之蓝牙‘sco over hci‘ 通话的使用配置(基于tinyalsa库)

    目录 一 引言 二 sco over hci gt HCI接口 gt 驱动中的 sco over hci 开关 三 声卡中PCM的使用配置 基于tinyalsa库 tiny工具 gt tiny 工具的使用 gt tinycap tinypl
  • leetcode-105.从前序与中序遍历序列构造二叉树

    题目 给定两个整数数组 preorder 和 inorder xff0c 其中 preorder 是二叉树的先序遍历 xff0c inorder 是同一棵树的中序遍历 xff0c 请构造二叉树并返回其根节点 示例 1 输入 preorder
  • 完整的扣减库存方案

    扣减库存方案设计 扣减库存步骤 查询库存 判断是否超出库存 开始扣减 付款 第三四步可以互换 遇到的问题 超卖现象 用户 A 和 B 成功下单 xff0c 在支付时扣减库存 xff0c 当前库存数为 10 因 A 和 B 查询库存时 xff
  • shell脚本标准输出赋值给变量

    方案一 xff1a bin bash string 61 34 hello world 34 result 61 echo string echo result 方案二 xff1a bin bash string 61 34 hello w
  • leetcode-99.恢复二叉搜索树

    题目 给你二叉搜索树的根节点 root xff0c 该树中的 恰好 两个节点的值被错误地交换 请在不改变其结构的情况下 xff0c 恢复这棵树 示例 1 xff1a 输入 xff1a root 61 1 3 null null 2 输出 x
  • 沟通中经常用到的几个库存术语

    周转库存 周转库存是商业企业为了完成商品流转计划 xff0c 保证市场正常供应 xff0c 根据商品销售任务 商品流通环节和速度应保持一定数量的周转需要的商品库存 商业企业的周转库存 xff0c 是组织商品流通必不可少的物质基础 周转库存量
  • 聊一聊什么是SaaS,以及遇到的问题......

    1 软件即服务 SaaS 的定义 SaaS是Software as a Service的缩写 xff0c 意为软件即服务 SaaS是一种软件部署模式 xff0c 第三方供应商在云基础设施上构建应用程序 xff0c 并以订阅的形式 xff0c
  • 斐波那契数列的递归优化《备忘录递归》

    暴力递归 斐波那契数列的数学形式就是递归 xff0c 直接上代码 xff1a span class token keyword public span span class token keyword static span span cl
  • SaaS多租户数据隔离的三种解决方案

    什么是SaaS xff1f SaaS是Software as a Service的缩写 xff0c 意为软件即服务 SaaS是一种软件部署模式 xff0c 第三方供应商在云基础设施上构建应用程序 xff0c 并以订阅的形式 xff0c 通过
  • 值得收藏的几个postman特色功能帮你事半功倍!

    为什么选择postman xff1f 目前市面上提供了以下几种接口测试工具 xff1a Apifox apifox的官方的定位是 xff1a Apifox 61 Postman 43 Swagger 43 Mock 43 JMeter 有桌
  • 看看大神是怎么在spring中运用设计模式的

    Spring中涉及的设计模式总结 1 简单工厂 非23种设计模式中的一种 实现方式 xff1a BeanFactory Spring中的BeanFactory就是简单工厂模式的体现 xff0c 根据传入一个唯一的标识来获得Bean对象 xf
  • JVM调参,看这一篇就够了

    文章目录 JVM相关参数调试内存相关垃圾回收器相关配置方式命令参考 JVM相关参数调试 通过实战的 方式来进行参数调试 xff0c 观察结果才能真正理解含义 xff0c 下面将通过一段代码 xff0c 来一个一个参数的进行测试 代码示例 后
  • JVM的内存结构

    JVM入门 jvm基础 什么是jvm 定义 xff1a Java Virtual Machine java 程序的运行环境 xff08 java 二进制字节码的运行环境 xff09 好处 xff1a 一次编写 xff0c 到处运行的基石自动
  • leetcode-3.无重复字符的最长子串

    给定一个字符串 s xff0c 请你找出其中不含有重复字符的 最长子串 的长度 示例 1 输入 s 61 abcabcbb 输出 3 解释 因为无重复字符的最长子串是 abc xff0c 所以其长度为 3 示例 2 输入 s 61 bbbb
  • 如何重启 Windows 10 子系统(WSL) ubuntu

    如何重启 Windows 10 子系统 xff08 WSL ubuntu WSL 子系统是基于 LxssManager 服务运行的 只需要将 LxssManager 重启即可 可以做成一个 bat 文件 net stop LxssManag
  • Mysql引擎innodb行锁的三种算法

    Mysql中的锁 基于锁的属性分类 xff1a 共享锁 排他锁 基于锁的状态分类 xff1a 意向共享锁 意向排它锁 根据锁的粒度分类 xff1a 全局锁 页锁 表级锁 行锁 xff08 记录锁 间隙锁 和临键锁 xff09 xff0c 实
  • Mysql引擎innodb的脏读,不可重复读,幻读问题

    脏读 概念 脏数据是指事务对缓冲池中行记录的修改 xff0c 并且还没有被提交 xff0c 就可能造成另一个事务读取到了另一个事务未提交的数据 xff0c 违反了数据库的隔离性 脏数据的读取 示例 xff1a 上面示例的隔离级别换成了REA