网站更换主机注意/青岛优化网站关键词
参考链接
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…...

llm的inference(二)
文章目录 Tokenizer分词1.单词分词法2.单字符分词法3.子词分词法BPE(字节对编码,Byte Pair Encoding)WordPieceUnigram Language Model(ULM) embedding的本质推理时的一些指标参考链接 Tokenizer 在使用模型前,都需要将sequence过一遍Tokenizer…...

pytorch -- torch.nn.Module
基础 torch.nn 是 PyTorch 中用于构建神经网络的模块。nn.Module包含网络各层的定义及forward方法。 在用户自定义神经网络时,需要继承自nn.Module类。通过继承 nn.Module 类,您可以创建自己的神经网络模型,并定义模型的结构和操作。 torch.n…...

Microsoft Edge 越用越慢、超级卡顿?网页B站播放卡顿?
记录10个小妙招 Microsoft Edge 启动缓慢、菜单导航卡顿、浏览响应沉闷?这些情况可能是由于系统资源不足或浏览器没及时更新引起的。接下来,我们将介绍 10 种简单的方法,让 Edge 浏览器的速度重新起飞。 基础检查与问题解决 如果 Microsoft…...

XGB-9: 分类数据
从1.5版本开始,XGBoost Python包为公共测试提供了对分类数据的实验性支持。对于数值数据,切分条件被定义为 v a l u e < t h r e s h o l d value < threshold value<threshold ,而对于分类数据,切分的定义取决于是否使用…...

FreeRTOS学习第8篇--同步和互斥操作引子
目录 FreeRTOS学习第8篇--同步和互斥操作引子同步和互斥概念实现同步和互斥的机制PrintTask_Task任务相关代码片段CalcTask_Task任务相关代码片段实验现象本文中使用的测试工程 FreeRTOS学习第8篇–同步和互斥操作引子 本文目标:学习与使用FreeRTOS中的同步和互斥操…...

c++STL容器的使用(vector, list, map, set等),c++STL算法的理解与使用(sort, find, binary_search等)
cSTL容器的使用(vector, list, map, set等) 在C的STL(Standard Template Library)中,容器是重要的一部分,它们提供了各种数据结构来存储和管理数据。以下是一些常见的STL容器及其使用方法的简要说明&#x…...

选择VR全景行业,需要了解哪些内容?
近年来,随着虚拟现实、增强现实等技术的持续发展,VR全景消费市场得以稳步扩张。其次,元宇宙行业的高速发展,也在进一步拉动VR全景技术的持续进步,带动VR产业的高质量发展。作为一种战略性的新兴产业,国家和…...

830. 单调栈
Problem: 830. 单调栈 文章目录 思路解题方法复杂度Code 思路 这是一个单调栈的问题。单调栈是一种特殊的栈结构,它的特点是栈中的元素保持单调性。在这个问题中,我们需要找到每个元素左边第一个比它小的元素,这就需要使用到单调递增栈。 我们…...

H5 个人引导页官网型源码
H5 个人引导页官网型源码 源码介绍:源码无后台、无数据库,H5自检测适应、无加密,直接修改可用。 源码含有多选项,多功能。可展示自己站点、团队站点。手机电脑双端。 下载地址: https://www.changyouzuhao.cn/1434.…...

【Linux】部署前后端分离项目---(Nginx自启,负载均衡)
目录 前言 一 Nginx(自启动) 2.1 Nginx的安装 2.2 设置自启动Nginx 二 Nginx负载均衡tomcat 2.1 准备两个tomcat 2.1.1 复制tomcat 2.1.2 修改server.xml文件 2.1.3 开放端口 2.2 Nginx配置 2.2.1 修改nginx.conf文件 2.2.2 重启Nginx服务 2…...