MySQL脏读、不可重复读、幻读

2023-10-29

[MySQL脏读、不可重复读、幻读]

事务的特性:【ACID】

  • 原子性【Atomicity】:指处于同一个事务中的多条语句是不可分割的,即一个事务内的所有语句,要么全部成功要么全部失败。
  • 一致性【Consistency】:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。比如转账,转账前两个账户余额之和为2k,转账之后也应该是2K。
  • 隔离性【Isolation】:指多线程环境下,一个线程中的事务不能被其他线程中的事务打扰
  • 持久性【Durability】:事务一旦提交,就应该被永久保存起来。

事务隔离性问题:
如果不考虑事务的隔离性,会出现以下问题:

  • 脏读:指一个线程中的事务读取到了另外一个线程中未commit或者回滚的数据。

  • 脏读官方定义:即一个事务中读取到另外一个事务中未提交的数据。

  • 不可重复读:指一个线程中的事务读取到了另外一个线程中【提交】的update的数据,导致两次读取到的数据内容不一致。

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

  • 幻读:指一个线程中的事务读取到了另外一个线程中【提交】的 insert的数据,两次读取到的数据总量不一样。
  • 幻读官方定义:指在同一事务下,连续执行两次同样的SQL语句可能导致不同的结果,第二次的SQL语句可能会返回之前不存在的行。

隔离级别:

隔离级别 脏读(Dirty Read) 不可重复读(NonRepeatable Read) 幻读(Phantom Read)
未提交读(Read uncommitted) 可能 可能 可能
已提交读(Read committed) 不可能 可能 可能
可重复读(Repeatable read) 不可能 不可能 可能
可串行化(Serializable ) 不可能 不可能 不可能

级别越高,数据越安全,但性能越低。

大致的区别在于

脏读是读取另一个事务中未提交的数据,比如在事务B中执行update但是还没有commit,事务A可以读取这个数据并使用,即使事务B进行了数据回滚,A仍然使用这个脏数据。(只有在RU级别下才会产生此问题)

不可重复读是由于另一个事务对数据的更改并提交所造成的两次读取不一致(MySQL官方将不可重复读的问题定义为Phantom Problem,即幻像问题)

而幻读是由于另一个事务插入或删除引起的数量不一致,本质上幻读是一种特殊的不可重复读,特指行。

RR级别,可重复读通过使用不同的快照读来实现:

  • Mysql对于RR的隔离级别下,读取的是事务开始时的快照【详见MVCC多版本并发控制】,所以此时不存在不可重复读现象。即使其它事务修改了A记录,本事务内再次查询仍与第一次查询结果一样,都是本事务开启时产生的A记录的快照版本。【这里对的快照都是指:行数据】
  • 在RC隔离级别下是读取最新的快照,如果其他事务更新了该记录,那么两次查询结果就不一样

Next-key-locking是如何解决幻读问题的:

在 RR(可重复读) 级别下,

如果查询条件为等值查询,能使用上唯一索引,或者是主键,那么降级,仅加行锁即可,

如果是一个范围查询,那么就会给这个范围加上 gap 锁或者 next-key锁 (行锁+gap锁)。

如果是辅助索引,且为等值查询,那么会使用Next-key-locking,在该值,以及该值上下临近的范围内加锁。比如辅助索引的值为 1,3,6,10; 查询where=3,会用nexy-key-lock锁住(1,3],然后用Gap-lock锁住(3,6)【注释:这里辅助索引是离散的,nexy-key-lock锁住的范围也不包含 1 和 6,但是包含1到6之间的范围】

如果是辅助索引且是范围查询,比如where > 6, 那么会锁住(6, +∞)这个范围,而不是10

结论:

  • next-key锁,是通过锁住查询范围,防止幻读的(防止其它事务向查询范围内插入或删除记录),也可以防止不可重复读,但RR级别下已经有了其他可重复读的实现方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL脏读、不可重复读、幻读 的相关文章

随机推荐

  • Android Studio Git功能使用

    Android Studio Git功能使用 简介 常用功能 提交代码到远程分支 合并分支代码 拉新分支 简介 在Android Studio中使用自带的Git管理工具来进行版本管理 可以轻松应对需要频繁进行本地分支和远程分支操作的项目 比
  • 成功解决pip/conda install cartopy安装失败问题

    使用pip 或conda 安装cartopy pip install cartopy 报错 ERROR Command errored out with exit status 1 command home mlli anaconda3 e
  • 前端学习笔记

    笔记 小知识 V ON绑定事件 V BIND绑定属性 Network中可以查看当前发起的请求 XHR这个标签出现在Chrome浏览器的开发者工具Network选项卡中 XHR类型即通过XMLHttpRequest方法发送的请求即AJAX请求
  • (React入门)状态state与属性props

    状态 State State介绍 状态 state 使用this state来引用 state本身就是状态的意思 状态指的是事物所处的状况 状况就是环境 通常使用state存储简单的视图状态 比如说下拉框是否显示 单选 是否选中 或者需要自
  • try-catch和throw,throws的区别和联系

    区别一 throw 是语句抛出一个异常 throws 是方法抛出一个异常 throw语法 throw lt 异常对象 gt 在方法声明中 添加throws子句表示该方法将抛出异常 如果一个方法会有异常 但你并不想处理这个异常 就在方法名后面
  • 【牛客面试必刷TOP101】Day4.BM15删除有序链表中重复的元素-I和BM17二分查找-I

    作者简介 大家好 我是未央 博客首页 未央 303 系列专栏 牛客面试必刷TOP101 每日一句 人的一生 可以有所作为的时机只有一次 那就是现在 文章目录 前言 一 删除有序链表中重复的元素 I 题目描述 解题分析 二 二分查找 I 题目
  • java与数据库数据加密方法

    1 java测试加密代码 AES和HEX加密及解密工具类 AES加解密字符串工具类 public class AesEncrypt public static void main String args String aes en aes
  • mysql数据库总结_mysql数据库总结

    1 root localhost yum y install mysql mysql server 利用yum在线安装mysql数据库 2 root localhost chkconfig mysqld on 设置开机启动mysqld服务
  • Android网络请求,全方位优雅解析

    网络请求的基本流程 网络请求步骤 用户输入一个网址到网页最终展现到用户面前 大致流程总结如下 在客户端浏览器中输入网址URL 发送到DNS 域名服务器 获得域名对应的WEB服务器的IP地址 客户端浏览器与WEB服务器建立TCP 传输控制协议
  • webpack chunkFilename设置name后不生效,id 生效

    preface 最近又开启新项目了 以之前的某个项目为基础搭建 我进行了优化 遇到了 chunkfilename name 配置后不生效 之前配置 webpack 2 6 1 webpack 配置 output path config bu
  • Jenkins从Gitlab拉取代码

    做持续集成经常需要从代码管理 下面讲一下如何使用Jenkins从Gitlab拉取代码 这里采用的是私钥 公钥配对模式 自己本地生成一堆秘钥 gitlab系统配置里选择Deploy Keys 内容为公钥 在Jenkins里新建Credenti
  • 【Python蒙特卡罗法计算圆周率】

    蒙特卡罗法计算圆周率 今天遇到一个很有意思的方法求解圆周率 给大家分享一下 理论基础 蒙特卡罗法也称统计模拟法 统计试验法 是把概率现象作为研究对象的数值模拟方法 是按抽样调查法求取统计值来推定未知特性量的计算方法 蒙特卡罗是摩纳哥的著名赌
  • Qt5.3 MIPS Openwrt交叉编译 移植

    网上关于ARM Linux移植比较多 在此把qt mips linux移植过程记录如下 参考https blog csdn net yihui8 article details 39503645 目标板 MIPS Openwrt 宿主 Ub
  • 计算机基础ppt2010知识点,《计算机应用基础(PowerPoint2010电子演示文稿系统)》...

    计算机应用基础 PowerPoint2010电子演示文稿系统 是教育部 十二五 职业教育国家规划教材 本书以向学习者传授计算机基础知识和培养计算机应用能力为主线 系统地介绍了计算机应用基础的一般理论和实训 本书的内容着重计算机的基础知识 基
  • Sqlserver中如何快速写入千万级测试数据

    数据库结构 id int username nvarchar 50 password nvarchar 50 addtime datetime token nvarchar 50 roleid int 一 程序中写for循环 实测一分钟写入
  • STM32_3(GPIO)

    一 GPIO简介 GPIO General Purpose Input Output 通用输入输出口 8种输入输出模式 输出模式可控制端口输出高电平 驱动LED 蜂鸣器 模拟通信协议输出时许等 输入模式可读取端口的高低电平或电压 用于读取按
  • Qt扩展-KDDockWidgets 简介及配置

    Qt扩展 KDDockWidgets 简介及配置 一 概述 二 编译 KDDockWidgets 库 1 Cmake Gui 中选择源文件和编译后的路径 2 点击Config 配置好编译器 3 点击Generate 4 在存放编译的文件夹输
  • Win10+OpenCV2.4.13+VS2013+CUDA7.5配置教程

    首先说明一下 OpenCV2 3 13之前的版本不支持CUDA7 5 因此配置总是会出问题 在OpenCV官网下载OpenCV2 4 13版本 此版本支持CUDA7 5 另外OpenCV2 4 13是支持VS2013的 但不清楚支不支持VS
  • 力扣:旋转数组(Java)

    给你一个数组 将数组中的元素向右轮转 k 个位置 其中 k 是非负数 class Solution public void rotate int nums int k int n nums length k n rotate 2 nums
  • MySQL脏读、不可重复读、幻读

    MySQL脏读 不可重复读 幻读 事务的特性 ACID 原子性 Atomicity 指处于同一个事务中的多条语句是不可分割的 即一个事务内的所有语句 要么全部成功要么全部失败 一致性 Consistency 事务必须使数据库从一个一致性状态