mysql的隔离级别,和实现
参考链接
https://xiaolincoding.com/mysql/transaction/mvcc.html#%E4%BA%8B%E5%8A%A1%E7%9A%84%E9%9A%94%E7%A6%BB%E7%BA%A7%E5%88%AB%E6%9C%89%E5%93%AA%E4%BA%9B
事务特性(ACID)
-
原子性(Atomicity): 事务是原子的,意味着事务中的所有操作要么全部成功执行,要么全部失败回滚。如果事务中的任何一个操作失败,整个事务将被回滚到初始状态,不会产生部分提交的结果。
-
一致性(Consistency): 事务的执行将使数据库从一个一致性状态转换到另一个一致性状态。这意味着事务执行过程中,数据库中的数据约束、关系和规则将得到维护和保持,保证数据库的完整性。
-
隔离性(Isolation): 数据库允许 多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致,因为多个事务同时使用相同的数据时,不会相互干扰,每个事务都有一个完整的数据空间,对其他并发事务是隔离的。也就是说,消费者购买商品这个事务,是不影响其他消费者购买的。
-
持久性(Durability): 事务一旦提交,其对数据库的修改应该是永久性的,即使发生系统崩溃或断电等故障,事务提交的结果也应该被永久保存在数据库中。
通过什么保证事务的特性
InnoDB 引擎保证事务的四个特性
- 持久性是通过 redo log (重做日志)来保证的;
- 原子性是通过 undo log(回滚日志) 来保证的;
- 隔离性是通过 MVCC(多版本并发控制) 或锁机制来保证的;【重点】
- 一致性则是通过持久性+原子性+隔离性来保证;
由于在并发执行多个事务时会出现交叉执行,导致数据不准确,因为需要进行事务的隔离
并发执行事务出现的问题
- **脏读(Dirty Read):指一个事务在读取了另一个事务未提交的数据时发生的现象。**例如,事务A修改了某行数据但还未提交,此时事务B读取了这个未提交的数据,如果事务A后来回滚了,则事务B读取到的数据实际上是无效的,这就是脏读
- 不可重复读(Non-repeatable Read):指在一个事务内,多次读取同一行数据时,由于其他事务对该行数据做了修改或删除,导致不同读取之间出现了不一致的情况。 例如,事务A在读取某行数据后,事务B修改了该行数据并提交,然后事务A再次读取同一行数据,此时读取到的数据与之前不一致,这就是不可重复读。
- 幻读(Phantom Read):指在一个事务内,多次执行同一个查询时, 由于其他事务对数据进行了插入或删除操作,导致查询结果集合不一致的现象。 例如,事务A在查询某个范围内的数据时,事务B在该范围内插入了新的数据,然后事务A再次查询同一范围的数据,发现结果集合中出现了之前不存在的新数据,这就是幻读。
事务的隔离级别
-
读未提交(Read Uncommitted):最低的隔离级别,在该级别下,一个事务可以读取另一个事务未提交的数据。这种隔离级别可能导致脏读、不可重复读和幻读的问题。
-
读已提交(Read Committed):事务只能读取已经提交的数据,可以避免脏读,但仍可能出现不可重复读和幻读的问题。
3. 可重复读(Repeatable Read):在同一个事务中多次读取同一行数据时,保证读取到的数据是一致的。其他事务对数据的修改不会影响到当前事务的查询结果,避免了不可重复读的问题。但仍可能出现幻读的问题。
(InnoDB 引擎的默认隔离级别)
实现方式:
InnoDB在每行记录后面保存两个隐藏的列来,分别保存了这个行的创建时间和行的删除时间。这里存储的并不是实际的时间值,而是系统版本号,当数据被修改时,版本号加1
在读取事务开始时,系统会给当前读事务一个版本号,事务会读取版本号<=当前版本号的数据
此时如果其他写事务修改了这条数据,那么这条数据的版本号就会加1,从而比当前读事务的版本号高,读事务自然而然的就读不到更新后的数据了
https://blog.csdn.net/qq_44836294/article/details/108059551
- 串行化(Serializable):最高的隔离级别,在该级别下,所有的事务都是按顺序执行的,事务之间不会相互影响,从而避免了脏读、不可重复读和幻读的问题。但是串行化级别会降低系统的并发性能,因为事务需要按顺序执行,无法并发执行。
隔离级别-----可重复读
MySQL InnoDB 引擎的默认隔离级别虽然是「可重复读」,但是它很大程度上避免幻读现象(并不是完全解决了,文章详细描述https://xiaolincoding.com/mysql/transaction/phantom.html#%E4%BB%80%E4%B9%88%E6%98%AF%E5%B9%BB%E8%AF%BB),解决的方案有两种:
- 针对快照读(普通 select 语句),是通过 MVCC 方式解决了幻读,因为可重复读隔离级别下,事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,即使中途有其他事务插入了一条数据,是查询不出来这条数据的,所以就很好了避免幻读问题。
- 针对当前读(select … for update 等语句),是通过 next-key lock(记录锁+间隙锁)方式解决了幻读,因为当执行 select … for update 语句的时候,会加上 next-key lock,如果有其他事务在 next-key lock 锁范围内插入了一条记录,那么这个插入语句就会被阻塞,无法成功插入,所以就很好了避免幻读问题。
MVCC(Multi-Version Concurrency Control)
是一种用于数据库管理系统中的 并发控制 方法,用于解决多个事务并发访问数据库时可能出现的一致性和并发性问题。
在MVCC中,每个数据行都会有多个版本,而不是仅有一个版本。当一个事务对数据进行修改时,不会直接覆盖原始数据,而是创建一个新版本,并保留原始版本。其他事务在读取数据时,可以同时看到不同版本的数据,这样就实现了事务之间的隔离性。
MVCC的实现通常包括以下几个关键组件:
-
版本管理器(Version Manager): 负责管理数据行的版本信息,包括创建新版本、回收旧版本等操作。
-
版本链(Version Chain): 用于存储同一行数据的多个版本,通常是一个链表结构,每个节点代表一个版本。
-
快照读(Snapshot Read): 在MVCC中,事务可以通过读取数据行的某个特定版本(称为快照)来实现读一致性,而不会受到其他事务并发修改的影响。
MVCC的优点包括:
- 提高了数据库的并发性能,因为读操作不会阻塞写操作,多个事务可以并发读取同一数据行的不同版本。
- 避免了读-写之间的锁竞争,减少了锁冲突带来的性能损耗。
- 实现了读一致性,每个事务看到的数据都是一致的,不会出现脏读、不可重复读等问题。
MVCC在许多现代数据库系统中得到了广泛的应用,例如MySQL、PostgreSQL等。
相关文章:
mysql的隔离级别,和实现
参考链接 https://xiaolincoding.com/mysql/transaction/mvcc.html#%E4%BA%8B%E5%8A%A1%E7%9A%84%E9%9A%94%E7%A6%BB%E7%BA%A7%E5%88%AB%E6%9C%89%E5%93%AA%E4%BA%9B 事务特性(ACID) 原子性(Atomicity): 事务是原子的&…...
Linux的信号
Linux的信号是一种用于进程之间通信的机制。它们用于向进程发送通知,告知进程发生了某种事件或请求进程执行某个操作。信号可以由内核、其他进程或进程自身发送。 信号的作用有以下几个方面: 通知进程某个事件的发生,如进程的终止、挂起、恢…...
Spring数据脱敏实现
在当今的数字化时代,数据安全和个人隐私保护变得日益重要。为了遵守各种数据保护法规,如欧盟的GDPR(通用数据保护条例),企业在处理敏感信息时需要格外小心。数据脱敏是一种常见的技术手段,用于隐藏敏感数据…...
Java核心-核心类与API(4)
话接上回,继续核心类与API的学习,最后介绍一下Object类以及与数学、日期/时间有关的类,就结束该部分的学习了,其他的根据需要自行了解。 一、Object类 1、概述 Object 是 Java 类库中的一个特殊类,也是所有类的父类…...
【C语言】详解计算机二级c语言程序题
文章目录 前言资料相关程序题 一(字符串)程序题 二(数组)程序题 三(基础)程序题 四(结构体)程序题 五(结构体)程序题 六(基础) 前言 …...
限流算法
下面对常见的限流算法进行讨论。目前,常用的限流算法主要有三种:计数器法、滑动窗口算法、漏桶算法和令牌桶算法。下面分别介绍其原理。 1. 计数器法 计数器法是通过计数对到来的请求进行选择性处理。如系统限制一秒内最多有X个请求,则在该…...
备战蓝桥杯 Day10(背包dp)
01背包问题 1267:【例9.11】01背包问题 【题目描述】 一个旅行者有一个最多能装 M� 公斤的背包,现在有 n� 件物品,它们的重量分别是W1,W2,...,Wn�1,�2&#…...
Sora 使用教程,新手小白可用
Sora 使用教程,新手小白可用 参考文章:Sora 使用教程,OpenAI 的文生视频模型 为了在激烈的行业竞争中保持领先地位,OpenAI 在 2024 年 2 月 15 日发布了其革命性的文本至视频转换模型——Sora。这个先进的工具能够将文本描述转化…...
【洛谷千题详解】P1031 均分纸牌
目录 题目描述 思路点拨 AC代码 题目描述 题目网址:[NOIP2002 提高组] 均分纸牌 - 洛谷 有 N 堆纸牌,编号分别为 1,2,……,N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若干张纸牌,然后移动。 移牌规则为&a…...
基于文本提示和语义分割的快速抠图
基于文本提示和语义分割的快速抠图 1. 介绍2. 效果展示3. 安装模型4. 命令行调用5. 代码调用5.1 模型加载5.2 可视化函数定义5.3 图像语义分割 6. 参考资料7. 结语服务 1. 介绍 传统的图像语义分割模型通常固定类别进行分割,而基于文本提示的语义分割模型则具有更高…...
什么是媒体发稿?发稿媒体分类及发稿流程
传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 媒体发稿是一种企业推广和宣传的手段,通过媒体渠道传递企业信息和形象。 媒体发稿的含义在于,当企业有新闻、事件或其他消息需要对外公布时,可以选择…...
安全测试自学手册之软件安全测试基础
安全测试的概念 定义:指有关验证应用程序的安全等级和识别潜在安全性缺陷的过程。】 应用软件的安全性测试:软件自身设计中存在的安全隐患,并检查软件对非法入侵的防御能力。系统级别的安全性测试:确保只有具备系统平台访问权限…...
【LeetCode】升级打怪之路 Day 04:链表 part 2
今日题目: 24. 两两交换链表中的节点19. 删除链表的倒数第 N 个结点160. 相交链表142. 环形链表 II 目录 LeetCode 24. 两两交换链表中的节点 【易错】LeetCode 19. 删除链表的倒数第 N 个结点 【还行】LeetCode 160. 相交链表(两个链表是否相交…...
JAVA编程题系列——涵盖几乎所有java内容
自己定义一个类,有static属性和构造方法,有构造方法重载,有其他方法(方法有对String类型操作) public class MyClass {// 静态属性public static String staticProperty "Static Property";// 成员变量priv…...
【Android12】Monkey压力测试源码执行流程分析
Monkey压力测试源码执行流程分析 Monkey是Android提供的用于应用程序自动化测试、压力测试的测试工具。 其源码路径(Android12)位于 /development/cmds/monkey/部署形式为Java Binary # development/cmds/monkey/Android.bp // Copyright 2008 The Android Open Source Proj…...
Java架构师之路八、安全技术:Web安全、网络安全、系统安全、数据安全等
目录 Web安全: 网络安全: 系统安全: 数据安全: Java架构师之路七、大数据:Hadoop、Spark、Hive、HBase、Kafka等-CSDN博客Java架构师之路九、设计模式:常见的设计模式,如单例模式、工厂模式…...
Codeforces Round 240 (Div. 1) C. Mashmokh and Reverse Operation(分治+逆序对)
原题链接:C. Mashmokh and Reverse Operation 题目大意: 给出一个长度为 2 n 2^{n} 2n 的正整数数组 a a a ,再给出 m m m 次操作。 每次操作给出一个数字 q q q ,把数组分为 2 n − q 2^{n-q} 2n−q 个长度为 2 q 2^{q} 2…...
SpringBoot源码解读与原理分析(三十二)SpringBoot整合JDBC(一)JDBC组件的自动装配
文章目录 前言第10章 SpringBoot整合JDBC10.1 SpringBoot整合JDBC的项目搭建10.1.1 初始化数据库10.1.2 整合项目10.1.2.1 导入JDBC和MySQL驱动依赖10.1.2.2 配置数据源 10.1.3 编写业务代码10.1.3.1 编写与t_user表对应的实体类User10.1.3.2 编写Dao层代码10.1.3.3 编写Servic…...
petalinux_zynq7 驱动DAC以及ADC模块之五:nodejs+vue3实现web网页波形显示
前文: petalinux_zynq7 C语言驱动DAC以及ADC模块之一:建立IPhttps://blog.csdn.net/qq_27158179/article/details/136234296petalinux_zynq7 C语言驱动DAC以及ADC模块之二:petalinuxhttps://blog.csdn.net/qq_27158179/article/details/1362…...
Android java中内部类的使用
一.成员内部类 实验1:成员内部类 class Outer {private int a 10;class Inner {public void printInfo(){System.out.println("a "a);}}}public class InnerDemo {public static void main(String args[]) {Outer o new Outer();Outer.Inner i o.new…...
C++轻量级HTTP库cpp-httplib:从嵌入式设备到企业服务的全场景解决方案
C轻量级HTTP库cpp-httplib:从嵌入式设备到企业服务的全场景解决方案 【免费下载链接】cpp-httplib A C header-only HTTP/HTTPS server and client library 项目地址: https://gitcode.com/GitHub_Trending/cp/cpp-httplib 在现代C开发中,构建网络…...
C盘清理与优化:为Realistic Vision V5.1模型文件腾出空间
C盘清理与优化:为Realistic Vision V5.1模型文件腾出空间 你是不是也遇到过这种情况:电脑C盘突然飘红,系统提示空间不足,想下载个新的AI模型,比如最近很火的Realistic Vision V5.1,却发现根本没地方放。看…...
终极指南:facenet-pytorch API参考手册与完整函数方法详解
终极指南:facenet-pytorch API参考手册与完整函数方法详解 【免费下载链接】facenet-pytorch Pretrained Pytorch face detection (MTCNN) and facial recognition (InceptionResnet) models 项目地址: https://gitcode.com/gh_mirrors/fa/facenet-pytorch f…...
ESFT-gate-summary-lite:AI快速提炼文本关键信息
ESFT-gate-summary-lite:AI快速提炼文本关键信息 【免费下载链接】ESFT-gate-summary-lite ESFT-gate-summary-lite模型,基于DeepSeek-ai的开源项目,专注于提升基础模型摘要能力。源自ESFT-vanilla-lite,强化文本摘要,…...
WavePWM库:嵌入式LED正弦调光算法与实现
1. WavePWM库概述:正弦波形LED调光的底层实现原理与工程应用 WavePWM是一个面向嵌入式LED驱动场景的轻量级波形PWM计算库,其核心价值不在于直接控制硬件引脚,而在于 以确定性数学模型生成高保真度的正弦(或类正弦/指数࿰…...
极客专属:OpenClaw+百川2-13B打造个人CLI智能助手
极客专属:OpenClaw百川2-13B打造个人CLI智能助手 1. 为什么开发者需要命令行智能助手 作为一个长期与终端打交道的开发者,我每天要重复执行大量机械操作:查看日志、运行测试、整理结果。这些工作虽然简单,却极其消耗精力。直到我…...
2026考公全攻略:在校生如何选岗、如何备考、如何上岸一次讲清
很多在校生最近都在问:现在开始准备公务员考试,还来得及吗先说结论:来得及,但前提是你要走对路径这几年考公环境已经发生明显变化报考人数持续增加岗位信息越来越透明单纯刷题已经不再有效考公正在从拼努力,变成拼策略…...
计算机毕业设计:汽车数据可视化与后台管理平台 Django框架 requests爬虫 可视化 车辆 数据分析 大数据 机器学习(建议收藏)✅
博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,…...
从锡膏印刷到炉温曲线:手把手调试你的第一条SMT生产线(避坑指南)
从锡膏印刷到炉温曲线:手把手调试你的第一条SMT生产线(避坑指南) 第一次接手SMT生产线调试时,我盯着那台二手贴片机的报警提示,手心全是汗。钢网上残留的锡膏像在嘲笑我的无知,而流水线上堆积的PCB板则不断…...
ES启动失败:深入解析No buffer space available错误及连接数优化策略
1. 当ES启动失败时发生了什么 第一次看到"No buffer space available"这个报错时,我也是一头雾水。那天凌晨三点,线上监控突然报警,ES集群集体罢工,整个搜索服务直接瘫痪。查看日志发现满屏都是"java.net.SocketE…...
