【MySQL】事务与MVCC

mysql事务ACID原理MVCC 幻读 文章目录mysql事务原理MVCC1存储引擎1.InnoDB存储引擎2.MyISAM存储引擎2.undo和redo的功能undo:redo:3.mysql锁3.1表级锁3.2行级锁3.3全局锁3.4避免阻塞与死锁阻塞:食堂排队3.5.mysql死锁不同表同一个表避免死锁4.MVCC多版本并发控制mvcc如何解决隔离性隐式字段Read View读已提交RC read-commited解决不可重复读RR read-repeatable解决不了幻读5.总结 mysql事务原理MVCC 书籍推荐:mysql必知必 阅读详情

MySQL事务与MVCC

1.定义

在计算机术语中事务是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

数据库事务可以保证多个对数据库的操作(也就是 SQL 语句)构成一个逻辑上的整体。

事务是逻辑上的一组操作,要么都执行,要么都不执行。

2.ACID

事务四个典型特性,即ACID,原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

  • 原子性:事务作为一个整体被执行,包含在其中的对数据库的操作要么全部都执行,要么都不执行。
  • 一致性:指在事务开始之前和事务结束以后,数据不会被破坏,假如A账户给B账户转10块钱,不管成功与否,A和B的总金额是不变的。
  • 隔离性:多个事务并发访问时,事务之间是相互隔离的,一个事务不应该被其他事务干扰,多个并发事务之间要相互隔离。。
  • 持久性:表示事务完成提交后,该事务对数据库所作的操作更改,将持久地保存在数据库之中。

3.事务并发存在的问题

  • 脏读:如果一个事务读取到了另一个未提交事务修改过的数据,我们就称发生了脏读现象。
  • 丢失修改:在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。
  • 不可重复读:同一个事务内,前后多次读取,读取到的数据内容不一致。
  • 幻读: 如果一个事务先根据某些搜索条件查询出一些记录,在该事务未提交时,另一个事务写入了一些符合那些搜索条件的记录(如insert、delete、update),就意味着发生了幻读。

数据库是通过加锁,来实现事务的隔离性的。比如串行化隔离级别就是加锁实现的。但是频繁的加锁,大大降低了数据库性能。 通过MVCC解决加锁之后的性能问题。

解决幻读的方法

解决幻读的方式有很多,但是它们的核心思想就是一个事务在操作某张表数据的时候,另外一个事务不允许新增或者删除这张表中的数据了。解决幻读的方式主要有以下几种:

  1. 将事务隔离级别调整为 SERIALIZABLE 。
  2. 在可重复读的事务级别下,给事务操作的这张表添加表锁。
  3. 在可重复读的事务级别下,给事务操作的这张表添加 Next-key Lock(Record Lock+Gap Lock)

4.隔离级别

SQL 标准定义了四个隔离级别:

  • READ-UNCOMMITTED(读取未提交) : 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
  • READ-COMMITTED(读取已提交) : 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
  • REPEATABLE-READ(可重复读) : 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
  • SERIALIZABLE(可串行化) : 最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
隔离级别脏读不可重复读幻读
READ-UNCOMMITTED√√√
READ-COMMITTED×√√
REPEATABLE-READ××√
SERIALIZABLE×××

5.MVCC

MVCC,即Multi-Version Concurrency Control (多版本并发控制)。它是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。

在事务隔离级别 RC 和 RR (InnoDB 存储引擎的默认事务隔离级别)下,InnoDB 存储引擎使用 MVCC(非锁定一致性读),但它们生成 Read View 的时机却不同

  • 在 RC 隔离级别下的 每次select 查询前都生成一个Read View (m_ids 列表)
  • 在 RR 隔离级别下只在事务开始后 第一次select 数据前生成一个Read View(m_ids 列表)
事务版本号

事务每次开启前,都会从数据库获得一个自增长的事务ID,可以从事务ID判断事务的执行先后顺序。这就是事务版本号。

隐藏字段

对于InnoDB存储引擎,每一行记录都有两个隐藏列trx_id、roll_pointer,如果表中没有主键和非NULL唯一键时,则还会有第三个隐藏的主键列row_id。

列名是否必须描述
row_id否单调递增的行ID,不是必需的,占用6个字节。
trx_id是记录操作该数据事务的事务ID
roll_pointer是这个隐藏列就相当于一个指针,指向回滚段的undo日志
undo log

undo log,回滚日志,用于记录数据被修改前的信息。在表记录修改之前,会先把数据拷贝到undo log里,如果事务回滚,即可以通过undo log来还原数据。

快照读和当前读

快照读: 读取的是记录数据的可见版本(有旧的版本)。不加锁,普通的select语句都是快照读,如:

select * from core_user where id > 2;

当前读:读取的是记录数据的最新版本,显式加锁的都是当前读

select * from core_user where id > 2 for update;
select * from account where id > 2 lock in share mode;
Read View
  • Read View是事务执行SQL语句时,产生的读视图。实际上在innodb中,每个SQL语句执行前都会得到一个Read View。
  • Read View主要是用来做可见性判断的,即判断当前事务可见哪个版本的数据。
  1. 如果数据事务ID trx_id < min_limit_id,表明生成该版本的事务在生成Read View前,已经提交(因为事务ID是递增的),所以该版本可以被当前事务访问。
  2. 如果trx_id>= max_limit_id,表明生成该版本的事务在生成ReadView后才生成,所以该版本不可以被当前事务访问。
  3. 如果 min_limit_id =<trx_id< max_limit_id,需要分3种情况讨论
  • (1).如果m_ids包含trx_id,则代表Read View生成时刻,这个事务还未提交,但是如果数据的trx_id等于creator_trx_id的话,表明数据是自己生成的,因此是可见的。
  • (2)如果m_ids包含trx_id,并且trx_id不等于creator_trx_id,则Read View生成时,事务未提交,并且不是自己生产的,所以当前事务也是看不见的;
  • (3).如果m_ids不包含trx_id,则说明你这个事务在Read View生成之前就已经提交了,修改的结果,当前事务是能看见的。

在这里插入图片描述

参考资料

看一遍就理解:MVCC原理详解

MySQL事务

详细原理、过程请参考上述文章及更多资料。

第4篇:使用 NModbus 库快速搭建 Modbus TCP 通信(从零开始用 C# 开发 Modbus 上位机) 本文介绍了如何使用 NModbus 库快速搭建 Modbus TCP 上位机通信程序。通过安装 NModbus4 NuGet 包,开发者可以轻松实现 Modbus TCP 连接,无需手动处理底层协议细节。文章详细演示了核心功能实现: 创建 TCP 客户端连接设备 读取保持寄存器(功能码0x03) 写入单个寄存器(功能码0x06) 关闭连接释放资源 提供完整C#示例代码,包含初始化连接、数据读写等关键操作,帮助开发者快速构建Modbus TCP通信应用。相比手动实现,NModbus库大幅简化了开发流程,特别适 阅读详情

相关推荐

脑影像分析入门:如何用一般线性模型(GLM)处理fMRI数据?

本文为神经影像研究入门者详细解析了如何运用一般线性模型(GLM)处理fMRI数据。文章从GLM的核心原理出发,逐步拆解了从实验设计、构建稳健设计矩阵、模型估计与统计推断,到高阶分析及多重比较校正的全流程,并指出了常见陷阱与结果解读要点,是掌握fMRI数据分析基础的关键指南。

weixin_29091445的博客 400

mysql事务&MVCC总结

MVCC:多版本控制协议,InnoDB是在undolog中实现的,在RR可重复读隔离级别下,在开启事务之后的第一条SELECT、UPDATE、DELETE或INSERT语句时, 会创建一个快照(read view), 将当前系统中活跃的事务记录起来;是所有数据的快照,不是当前select出的数据快照最早的数据库系统,只有读读之间可以并发,读写,写读,写写都要阻塞。引入多版本之后,只有写写之间相互阻塞,其他三种操作都可以并行,这样大幅度提高了InnoDB的并发度。

weixin_44100022的博客 205

数学建模国赛C题实战:从数据预处理到模型优化的完整流程(附Python代码)

本文系统讲解了数学建模国赛C题的完整实战流程,涵盖从数据预处理、模型选择与构建到优化与结果可视化的关键步骤。文章重点分享了如何利用Python进行高效的数据清洗、特征工程,并提供了多种机器学习模型的实现代码与对比验证方法,旨在帮助参赛者构建逻辑清晰、结果可靠的解决方案。

weixin_29079643的博客 293

深入学习MySQL事务:ACID特性的实现原理

一、基础概念 事务(Transaction)是访问和更新数据库的程序执行单元;事务中可能包含一个或多个sql语句,这些语句要么都执行,要么都不执行。作为一个关系型数据库,MySQL支持事务,本文介绍基于MySQL5.6。 首先回顾一下MySQL事务的基础知识。 1. 逻辑架构和存储引擎 如上图所示,MySQL服务器逻辑架构从上往下可以分为三层: (1)第一层:处理客户端连接、授权认证等。 (2)第二层:服务器层,负责查询语句的解析、优化、缓存以及内置函数的实现、存储过程等。 (3)第三层:

hands 500

VS2022跨平台开发实战:SSH远程调试Linux程序全攻略

本文详细介绍了如何使用Visual Studio 2022进行跨平台开发,通过SSH协议远程调试部署在Linux服务器上的C/C++程序。文章提供了从环境搭建、连接配置、项目创建到编译调试的完整实战指南,帮助Windows开发者无缝衔接Linux环境,显著提升问题定位与开发效率。

weixin_28826521的博客 429

Camera AF和FF

Camera按对焦功能可以分为FF(Fixed Focus)和AF(Auto Focus),即固定对焦和自动对焦。固定对焦顾名思义就是焦距是固定的,而自动对焦可以通过移动镜头位置来改变焦距从而实现自动对焦。以前摄像的功能机大多是固定对焦,现在的手机都带有自动对焦功能。 FF模组包括镜头(Lens),传感器(Sensor),红外滤色器(IR Filter),电路板(PCB),镜头支撑(Lens Holder),连接器(Connector)。 Fig 1. FF Module AF模组包括FF模组,音圈马达(V

Coppa的博客 1万+

事务和MVCC

一、SQL事务 事务是确保数据库一致的机制,尤其是发生错误或者服务器崩溃的情况下确保数据库一致的机制。 事务的特性:ACID, 即原子性、一致性、隔离性、持久性 原子性:一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其 中的一部分操作,这就是事务的原子性。 一致性:数据库总是从一个一致性的状态转换到另外...

u012139282的博客 420

Pytorch实现softmax多分类

PyTorch实现softmax多分类

天涯雨的博客 1388

【MySQL】深入解析事务与MVCC

指的是:事务执行前后,数据库中的数据是一致的。此时可以看到,由于记录的事务id为1,不论是事务A还是事务B的事务id都是 > 记录的trx_id,所以事务A和事务B都能够读取到这行数据。,该机制是InnoDB存储引擎特有的,它解决了并发事务场景下的读写性能问题,完全不需要加锁。,所以对于事务B来说就可以看见事务A修改并提交的数据,由于每次查询操作都会创建最新的。此时事务B再次读取记录信息时,就会发现这条记录的事务id为2,在事务B的。指的是:数据库中多个事务操作之间不会互相干扰,并发执行的事务之间是。

保持学习 1348

STC单片机 普通 I/O 口中断功能介绍和使用

STC32单片机 普通 I/O 口中断功能介绍和使用

perseverance51博客 3048

Python 爬虫实战:雪球用户数据爬取与投资行为分析(含 API 签名算法解析)

雪球作为国内领先的投资者社区,拥有丰富的用户数据和投资信息。通过爬取雪球用户数据并进行分析,我们可以深入了解用户的持仓偏好、交易行为和投资策略,为企业和投资者提供有价值的市场洞察。

yansideyucsdn的博客 2246

MySQL事务、MVCC

本文主要介绍了事务的概念、并发事务的问题、隔离级别、MVCC多版本并发控制

来到人间不过是个蹭饭的客人,还挑什么酸甜苦辣。 276

宇树G1机器人遥控器音频控制实战

本文介绍了宇树G1人形机器人遥控器控制音频播放的核心实现方案。通过DDS消息订阅获取遥控器输入,采用非阻塞的subprocess调用aplay命令控制外接音响设备。系统支持播放、暂停和重播功能,采用50ms轮询间隔实现实时响应。关键点包括遥控器初始化、音频进程管理(Popen)、退出机制。文章还提供了设备配置指南、遥控器按键说明和常见问题解决方案。该方案从复杂音频播放器中提炼出核心控制逻辑,可作为机器人交互开发的参考模板。

m0_47999117的博客 542

MySQL-事务(下)-MySQL事务隔离级别与MVCC

MySQL事务隔离级别与MVCC机制解析:文章深入剖析了MySQL四种事务隔离级别(读未提交、读已提交、可重复读、可串行化)及其解决的数据一致性问题,重点讲解了默认的可重复读级别。详细阐述了MVCC工作原理,包括隐藏字段、undo日志和ReadView三个关键概念,通过示例演示了版本链形成过程。最后对比了RR和RC隔离级别的本质区别——ReadView生成时机的不同,解释了RR如何避免不可重复读问题。这些核心机制共同保障了数据库在并发环境下的数据一致性和高性能。

nplplus的博客 6232

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【MySQL】事务(隔离性、MVCC)

事务的概念以及原理

weixin_69380220的博客 1776

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

从 MySQL 的事务 到 锁机制 再到 MVCC

转眼又一年~~2023马上就要到尾声了,在最后的几天中,我想给大家分享一下 MySQL 的一些小知识。在MySQL InnoDB引擎层面,又有新的解决方案 (解决加锁后读写性能问题),叫做MVCC(Multi-Version Concurrency Control)多版本并发控制。在MVCC下,就可以做到读写不阻塞且避免了类似脏读这样的问题。那MVCC是怎么做的呢?MVCC通过生成数据快照 (Snapshot)并用这个快照来提供一定级别 (语句级或事务级)的一致性读取。

船到桥头自然直 5300

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

MySQL事务并发问题和MVCC机制

在MySQL的InnoDB存储引擎下 RC和RR 事务隔离级别都是基于这个MVCC(多版本并发控制)进行并发事务的控制的然后这个MVCC是基于这个"数据版本"对并发事务进行访问的。

qq_66627105的博客 1641

MySQL-事务-MySQL事务隔离级别与MVCC

MVCC机制通过多版本控制有效平衡了并发性能与数据一致性37。更细粒度的版本管理混合事务存储模型跨节点版本协调机制。

a20215的博客 988

mysql 事务原理 mvcc_mysql事务原理及MVCC

mysql事务原理及MVCC事务是数据库最为重要的机制之一,凡是使用过数据库的人,都了解数据库的事务机制,也对ACID四个基本特性如数家珍。但是聊起事务或者ACID的底层实现原理,往往言之不详,不明所以。在MySQL中的事务是由存储引擎实现的,而且支持事务的存储引擎不多,我们主要讲解InnoDB存储引擎中的事务。所以,今天我们就一起来分析和探讨InnoDB的事务机制,希望能建立起对事务底层实现原理...

weixin_39616222的博客 241

MYSQL事务与MVCC

mysql事务与MVCC

yan_pan的博客 232

MySQL的事务原理及MVCC

事务简介、特性的讲解以及三种读取问题和事务隔离级别,mvcc的介绍和原理的解释

2301_82014959的博客 1194

【MySQL系列4】深入分析MySQL中事务以及MVCC的实现原理

MySQL事务及MVCC前言 前言 前面几篇,我们分析了MySQL中索引的相关知识以及explain执行计划分析,想必大家对索引已经有了基本的认识,那么这一篇,我将为大家介绍一下MySQL中事务以及MVCC相关知识 ...

zwx900102的博客 5509

MySQL事务及MVCC

在我们日常开发中事务是很常用的,今天我们一起来了解下MySQL的事务及实现原理。

weixin_46017166的博客 691

MySQL中的事务和MVCC

虽然我们不是DBA,可能对数据库没那么了解,但是对于数据库中的索引、事务、锁,我们还是必须要有一个较为浅显的认识,今天我就和大家聊聊事务。

IT_1120的博客 1252

MySQL从入门到精通(十三):事务原理、MVCC

事务是数据库操作的基本单位,确保操作的原子性、一致性、隔离性和持久性。InnoDB引擎通过redo log和undo log保证事务的原子性、一致性和持久性,而隔离性则通过锁和多版本并发控制(MVCC)实现。Redo log记录事务提交时的物理修改,确保数据持久性;Undo log记录数据修改前的信息,支持事务回滚和MVCC。MVCC通过隐藏字段、Undo Log版本链和Read View实现非阻塞读,确保事务隔离性。不同隔离级别下,Read View的生成时机不同,影响事务的可见性。通过redo log、

gadiaola的博客 2005

MySQL事务与MVCC

事务是数据库管理系统(DBMS)执行过程中的一个逻辑单位(不可再进行分割),由一个有限的数据库操作序列构成(多个DML语句,select语句不包含事务),要不全部成功,要不全部不成功。 A 给B 要划钱,A 的账户-1000元, B 的账户就要+1000元,这两个update 语句必须作为一个整体来执行,不然A 扣钱了,B 没有加钱这种情况就是错误的。那么事务就可以保证A 、B 账户的变动要么全部一起发生,要么全部一起不发生。

m0_62943934的博客 1661
上一篇: Linux配置应用自启动
下一篇: 【网络安全】ICMP隐蔽隧道通信与检测
Tyfrank
博客等级 码龄7年 35粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值