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

MySQL篇(四)事务相关知识详解

MySQL篇(四)事务相关知识详解

  • MySQL篇(四)事务相关知识详解
    • 一、事务的特性(ACID)
      • 原子性(Atomicity)
      • 一致性(Consistency)
      • 隔离性(Isolation)
      • 持久性(Durability)
    • 二、并发事务带来的问题
      • 脏读(Dirty Read)
      • 不可重复读(Non - repeatable Read)
      • 幻读(Phantom Read)
    • 三、解决并发事务问题的方法
      • 读未提交(Read Uncommitted)
      • 读已提交(Read Committed)
      • 可重复读(Repeatable Read)
      • 串行化(Serializable)
    • 四、MySQL的默认隔离级别
    • 五、undo log和redo log的区别
      • undo log
      • redo log
    • 六、MySQL中的MVCC(多版本并发控制)

MySQL篇(四)事务相关知识详解

一、事务的特性(ACID)

原子性(Atomicity)

原子性是指事务是一个不可分割的工作单位,事务中的操作要么全部执行,要么全部不执行。比如在银行转账中,从一个账户扣款和向另一个账户存款这两个操作必须同时成功或者同时失败,不能只执行其中一个操作 ,确保了数据的完整性和一致性。

一致性(Consistency)

一致性是指事务执行前后,数据库的完整性约束没有被破坏 。例如转账前后,两个账户的总金额应该保持不变。它关注的是业务逻辑上的正确性,通过原子性、隔离性和持久性来保证。

隔离性(Isolation)

隔离性是指多个事务并发执行时,一个事务的执行不能被其他事务干扰。不同的隔离级别决定了事务之间相互干扰的程度,比如在高并发场景下,多个事务同时操作相同数据时,隔离性可以防止数据出现脏读、不可重复读、幻读等问题。

持久性(Durability)

持久性是指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,接下来的其他操作或故障不应该对其执行结果有任何影响 。例如转账成功提交事务后,即使系统崩溃,转账的结果依然存在。

二、并发事务带来的问题

脏读(Dirty Read)

一个事务读取到了另一个事务尚未提交的数据。比如事务A修改了某条记录但未提交,此时事务B读取了这条被修改但未提交的记录,如果事务A回滚,事务B读取到的数据就是无效的脏数据。

不可重复读(Non - repeatable Read)

在一个事务内多次读取同一数据时,由于其他事务对该数据进行了修改并提交,导致在本事务中多次读取的数据不一致。例如事务A读取某条记录,然后事务B修改并提交了这条记录,事务A再次读取时得到了不同的值。

幻读(Phantom Read)

在一个事务中执行查询操作,在事务执行过程中,由于其他事务插入了新的数据,当该事务再次执行相同的查询时,结果集发生了变化,就好像产生了“幻影”数据。比如事务A查询符合某条件的记录,事务B插入了符合该条件的新记录并提交,事务A再次查询时就会发现多了一些记录。

三、解决并发事务问题的方法

通过设置不同的事务隔离级别来解决并发事务问题:

读未提交(Read Uncommitted)

最低的隔离级别,允许读取未提交的数据,会导致脏读、不可重复读和幻读问题,一般很少使用。

读已提交(Read Committed)

一个事务只能读取其他事务已经提交的数据。可以避免脏读,但仍然可能出现不可重复读和幻读问题,是大多数数据库的默认隔离级别(MySQL默认不是这个 )。

可重复读(Repeatable Read)

在一个事务内的多次读取操作会返回相同的数据,即使其他事务对数据进行了修改并提交。可以避免脏读和不可重复读,但在某些情况下仍可能存在幻读问题。MySQL的默认隔离级别是可重复读,通过MVCC(多版本并发控制)机制在一定程度上解决了幻读问题。

串行化(Serializable)

最高的隔离级别,事务会按照顺序依次执行,就像单线程环境一样,能避免脏读、不可重复读和幻读的所有问题,但并发性能较差。

四、MySQL的默认隔离级别

MySQL的默认隔离级别是可重复读(Repeatable Read) 。在这种隔离级别下,MySQL通过MVCC机制来实现事务的并发控制。MVCC为每个事务维护一个一致性视图,事务在读取数据时,根据这个视图来判断数据的可见性,从而在保证数据一致性的同时提高并发性能。

五、undo log和redo log的区别

undo log

undo log主要用于事务的回滚操作。当事务执行过程中需要回滚时,undo log可以记录数据修改前的版本信息,通过这些信息将数据恢复到事务开始前的状态。同时,undo log在MVCC机制中也起到重要作用,用于构建一致性视图,提供旧版本数据的可见性判断依据。

redo log

redo log主要用于保障事务的持久性。在事务提交时,先将事务的修改操作记录到redo log中,然后再将数据真正写入磁盘。当数据库发生崩溃恢复时,可以根据redo log中的记录将数据恢复到事务提交后的状态,确保已提交事务的数据不会丢失。

六、MySQL中的MVCC(多版本并发控制)

MVCC是一种用于实现数据库并发控制的机制,它通过为数据库中的每行数据维护多个版本来实现事务的并发执行。在MySQL的InnoDB存储引擎中:

  • 实现原理:MVCC为每行数据记录多个版本,每个版本包含事务ID等信息。当事务读取数据时,根据事务的开始时间戳和数据版本的事务ID来判断数据是否可见。如果数据版本的事务ID小于当前事务的开始时间戳,那么该版本数据对当前事务可见;否则不可见。
  • 作用:MVCC可以在不使用锁(或减少锁的使用)的情况下,实现事务的并发读取,提高了数据库的并发性能,同时在可重复读隔离级别下,配合undo log有效解决了脏读、不可重复读问题,并在一定程度上缓解了幻读问题。

相关文章:

MySQL篇(四)事务相关知识详解

MySQL篇(四)事务相关知识详解 MySQL篇(四)事务相关知识详解一、事务的特性(ACID)原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(…...

React 项目使用 pdf.js 及 Elasticpdf 教程

摘要:本文章介绍如何在 React 中使用 pdf.js 及基于 pdf.js 的批注开发包 Elasticpdf。简单 5 步可完成集成部署,包括数据的云端同步,示例代码完善且简单,文末有集成代码分享。 1. 工具库介绍与 Demo 1.1 代码包结构 ElasticP…...

性能测试之jmeter的基本使用

简介 Jmeter是Apache的开源项目,基于Java开发,主要用于进行压力测试。 优点:开源免费、支持多协议、轻量级、功能强大 官网:https://jmeter.apache.org/index.html 安装 安装步骤: 下载:进入jmeter的…...

CAD插件实现:所有文字显示到列表、缩放、编辑——CAD-c#二次开发

当图中有大量文字,需要全部显示到一个列表时并缩放到需要的文字时,可采用插件实现,效果如下: 附部分代码如下: private void BtnSelectText_Click(object sender, EventArgs e){var doc Application.DocumentManager.…...

【Git】“warning: LF will be replaced by CRLF”的解决办法

一、原因分析 不同操作系统的换行符标准不同: • Windows:使用 CRLF(\r\n)表示换行; • Linux/Mac:使用 LF(\n)表示换行 Git 检测到本地文件的换行符与仓库设置或目标平台不兼容时…...

vue2(13) 组件注册的学习笔记

文章目录 Vue2 组件注册学习笔记一、组件注册的基本概念二、全局注册三、局部注册四、组件名的命名规范五、在模块系统中注册组件六、基础组件的自动化全局注册七、总结Vue2 组件注册学习笔记 一、组件注册的基本概念 在Vue中,组件是可复用的Vue实例,具有封装的模板和逻辑。…...

【spring Cloud Netflix】OpenFeign组件

1.概述 Feign旨在使编写Java Http客户端变得更容易。前面在使用RibbonRestTemplate进行服务的远程调用 时,利用RestTemplate对Http请求的封装处理,形成了一套模板化的调用方法。但是在实际开发中,由 于对服务的依赖调用可不止一处&#xff0…...

go游戏后端开发20:房间消息推送处理

创建房间逻辑前的概念梳理及代码实现 在编写创建房间的逻辑之前,我们需要先创建几个关键概念。 第一个概念是“联盟”。联盟可以理解为一个组织,它持有多个房间。一个联盟下可能挂载多个房间,这是我们的第一个概念。 第二个概念是“管理”…...

Oracle数据库数据编程SQL<8 文本编辑器Notepad++和UltraEdit(UE)对比>

首先,用户界面方面。Notepad是开源的,界面看起来比较简洁,可能更适合喜欢轻量级工具的用户。而UltraEdit作为商业软件,界面可能更现代化,功能布局更复杂一些。不过,UltraEdit支持更多的主题和自定义选项&am…...

Linux驱动开发练习案例

1 开发目标 1.1 架构图 操作系统:基于Linux5.10.10源码和STM32MP157开发板,完成tf-a(FSBL)、u-boot(SSBL)、uImage、dtbs的裁剪; 驱动层:为每个外设配置DTS并且单独封装外设驱动模块。其中电压ADC测试,采用linux内核…...

Windows程序中计时器WM_TIMER消息的使用

本文章是对《Windows程序设计》这本书第八章计时器的总结,如果有时间,可以去看书里的讲解,如果时间不充裕,想马上知道计时器该如何使用,欢迎阅读本文,本文已经将计时器的干货整理完毕! 什么是计…...

Apache httpclient okhttp(1)

学习链接 Apache httpclient & okhttp(1) Apache httpclient & okhttp(2) httpcomponents-client github apache httpclient文档 apache httpclient文档详细使用 log4j日志官方文档 【Java基础】- HttpURLConnection…...

微信小程序—路由

关于 app.json 中的配置 app.json 主要是对整个小程序进行一个全局的配置。 pages:在这个配置项目中,就可以配置小程序里面的页面,小程序默认显示 pages 数组中的第一个页面windows:主要配置和导航栏相关的 当然,在…...

人工智能驱动的数据仓库优化:现状、挑战与未来趋势

1. 引言:数据仓库的演进与人工智能驱动优化的兴起 现代数据仓库的复杂性和规模正以前所未有的速度增长,这主要是由于数据量、种类和产生速度的急剧增加所致。传统的数据仓库技术在应对这些现代数据需求方面显得力不从心,这催生了对更先进解决…...

LVS高可用负载均衡

一、项目图 二、主机规划 主机系统安装应用网络IPclientredhat 9.5无NAT192.168.72.115/24lvs-masterredhat 9.5ipvsadm,keepalivedNAT192.168.72.116/24 VIP 192.168.72.100/32lvs-backupredhat 9.5ipvsadm,keepalivedNAT192.168.72.117/24 VIP 192.168…...

脑影像分析软件推荐 | JuSpace

目录 1. 软件界面 2.工具包功能简介 3.软件安装注意事项 参考文献: Dukart J, Holiga S, Rullmann M, Lanzenberger R, Hawkins PCT, Mehta MA, Hesse S, Barthel H, Sabri O, Jech R, Eickhoff SB. JuSpace: A tool for spatial correlation analyses of magne…...

集合框架——常用类

集合框架的理解 就是一个常用类 集合主要有三种类型【集合与集合之间可以互转】 List(列表,是接口)Set(集合,是接口)Map(键值对,是接口)Collection是以上及所有集合的根接口,其里面的子类,一部分支持集合有序元素可重复,一部分支持集合无序元素不重复 可重复和不…...

【NLP 面经 7、常见transformer面试题】

目录 1. 为何使用多头注意力机制? 2. Q和K使用不同权重矩阵的原因 3. 选择点乘而非加法的原因 4. Attention进行scaled的原因 5. 对padding做mask操作 6. 多头注意力降维原因 7. Transformer Encoder模块简介 8. 乘以embedding size的开方的意义 9. 位置编码 10. 其…...

分布式事务解决方案全解析:从经典模式到现代实践

前言 在分布式系统中,数据一致性是一个核心问题。随着微服务架构的普及,跨服务、跨数据库的操作变得越来越普遍,如何保证这些操作的原子性、一致性、隔离性和持久性(ACID)成为了一个极具挑战性的任务。本文将全面介绍…...

软件工程面试题(二十七)

1、j a v a 对象初始化顺序 1.类的初始化(initialization class & interface) 2.对象的创建(creation of new class instances) 顺序:应为类的加载肯定是第一步的,所以类的初始化在前。大体的初始化顺序是: 类初始化 -> 子类构造函数 -> 父类构造函数 -&g…...

fastGPT—nextjs—mongoose—团队管理之部门相关api接口实现

创建部门或者子部门 import type { NextApiRequest, NextApiResponse } from next; import { NextAPI } from /service/middleware/entry; import { MongoOrgModel } from fastgpt/service/support/permission/org/orgSchema;async function handler(req: NextApiRequest, res…...

C++ 数据竞态检查

-fsanitizethread 编译时,添加参数-fsanitizethread -g,可以运行态检查数据竞态问题,包括: 数据竞态死锁锁、条件变量错误使用 check_tsan 开源库 yalantinglibs有段检查编译器是否支持 fsanitize 编译参数的宏,挺…...

逛好公园的好处

逛公园和软件开发看似是两个不同的活动,但它们之间存在一些有趣的关联和相互促进的关系: 激发创造力:公园中的自然景观、多样的人群以及各种活动能为开发者带来新的灵感和创意。软件开发过程中,从公园中获得的创意可以帮助开发者设…...

C++开发工具全景指南

专业编译与调试工具深度解析 2025年4月 编译器套件 GNU Compiler Collection (GCC) GNU编译器套件是自由软件基金会开发的跨平台编译器系统,支持C、C、Objective-C、Fortran、Ada等多种编程语言。作为Linux系统的标准编译器,GCC以其强大的优化能力和…...

【网络安全】 防火墙技术

防火墙是网络安全防御的重要组成部分,它的主要任务是阻止或限制不安全的网络通信。在这篇文章中,我们将详细介绍防火墙的工作原理,类型以及如何配置和使用防火墙。我们将尽可能使用简单的语言和实例,以便于初学者理解。 一、什么…...

文档的预解析

1. 预解析的核心目标 浏览器在正式解析(Parsing)HTML 前,会启动一个轻量级的 预解析器(Pre-Parser),快速扫描文档内容,实现: 提前发现并加载关键资源(如 CSS、JavaScrip…...

理解“功能内聚”

链接: 理解“偶然内聚” 理解“逻辑内聚” 理解“时间内聚” 理解“过程内聚” 理解“通信内聚” 理解“顺序内聚” 理解“功能内聚” 功能内聚(Functional Cohesion)是最高级别的内聚形式,指的是模块内的所有元素都紧密地围绕着一…...

windows 常用命令总结

工作中用到的 Linux 总结(持续更新中...)_linux工作经验-CSDN博客 PS: 推荐使用 powershell 而不是 cmd,因为PowerShell 是一个更先进和功能更强大的工具( powershell 有命令记忆功能,比较方便&#xff09…...

记一次表格数据排序优化(一)--排序30000条数据有多卡

目录 需求 第一次尝试 运行环境 思路 存储 排序 触发排序操作 如何实现高效的排序 关键1 关键2 关键3 磨刀不误砍柴工 关键4 代码 效果 卡顿原因分析 原因1 原因2 第二次尝试 需求 1 我的qt程序通过表格显示30000条数据。数据来自udp,udp每隔10秒…...

图形渲染中的定点数和浮点数

三种API的NDC区别 NDC全称,Normalized Device Coordinates Metal、Vulkan、OpenGL的区别如下: featureOpenGL NDCMetal NDCVulkan NDC坐标系右手左手右手z值范围[-1,1][0,1][0,1]xy视口范围[-1,1][-1,1][-1,1] GPU渲染的定点数和浮点数 定点数类型&a…...