mysql事务基本特征与浅谈mvcc模式事务读取一致性问题解决

MySQL的事务隔离级别、锁机制、MVCC的原理 MVCC(Multi-Version Concurrency Control,多版本并发控制)是 MySQL中 InnoDB 引擎实现高并发访问的核心机制,通过数据多版本化解决读写冲突,实现非阻塞读取。MVCC 相对于为每个修改保存一个版本,版本与事务时间戳关系,读操作只读该事务开始前的数据库的快照。它是通过数据库记录中的隐式字段 Undo Log、Read View 实现的。MVCC 可以很好地平衡好性能和数据安全性之间的关系,在不加锁的情况下避免多事务竞争带来的不可重复读、脏读、幻读的问题。 阅读详情

1、事务的特征以及事务并发造成的问题

2、事务读取一致性问题的解决方案

3、举例浅谈mvcc的原理

事务的特征以及事务并发造成的问题:

什么是事务:

定义:事务是数据库管理系统(DBMS)执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。

个人理解:通俗点说就是Navicat中打开的一个查询页面,就是一个事务,执行查询要么全部成功,要么全部失败。严谨点就是,mysql事务是一组原子性的SQL查询,或者说一个独立的工作单元,事务内的语句,要么全部执行成功,要么全部执行失败。它是一个逻辑单位,整体不能分割。

事务的典型场景:

一般来说数据库的事务类似类似代码中多线程。遇到有关数据变动操作时,在代码中使用事务注解,开启事务,实现拦截。再具体些的场景好比订单系统中操作,订单,物流的信息都需要在一个事务中完成,以免造成数据由多条请求操作,导致数据不准确。

支持事务的搜索引擎:

(1)InnoDB,由于其支持事务,所以也是默认搜索引擎

(2)NDB,支持集群的搜索引擎

事务的四大特性:

l 原子性(Atomicity) [ˌætəˈmɪsɪti] undo log

l 一致性(Consistent) [kənˈsɪstənt]

l 隔离性(Isolation) [ˌaɪsəˈleɪʃn]

l 持久性(Durable) [ ˈ dj ʊə r ə bl]

事务如何开启与关闭:

MySQL中如何开启事务:
set session autocommit = on/off;                    -- 设定事务是否自动开启
begin / start transaction                                    -- 手工方式开启事务
commit / rollback                                               -- 事务提交或回滚,关闭事务
ps:      可视化工具窗口关闭。事务的锁在结束后会释放。

事务读取一致性问题的解决方案:

 参考http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt,网页中中搜 "_iso",其中p1,p2,p3问题就是这三个问题:

详细来看下这三个问题:

脏读:就是一个事务读到另一个事务没有提交的数据。事务B修改了一个数据,但未提交,事务A读到了事务B未提交的更新结果,事务A读到的就是脏数据。如下图示意

幻读:就是一个事务读到另一个事务新增加并提交的数据(insert)。在同一个事务中,对于同一组数据读取到的结果不一致。比如,事务B新增了一条记录,事务A 在 事务B提交前后各执行了一次查询操作,发现后一次比前一次多了一条记录。幻读出现的原因就是由于事务并发新增记录而导致的。(仅限更新和删除操作)如下图示意

不可重复读: 就是一个事务读到另一个事务修改后并提交的数据(update)。在同一个事务中,对于同一组数据读取到的结果不一致。比如,事务A 在 事务B 提交前读到的结果,和在 事务B 提交后读到的结果可能不同。不可重复读出现的原因就是由于事务并发修改记录而导致的。读取了其他事务提交的数据(仅限插入操作)如下图示意

事务并发三大问题都是数据库读一致性问题,由数据库提供的事务隔离机制来解决。

由此可以引入事务隔离级别这个概念:

事务的隔离级别有四种,从低到高分别是:读未提交、读已提交、可重复读、序列化。
  读未提交: Read Uncommitted,顾名思义,就是一个事务可以读取另一个未提交事务的数据。最低级别,它存在4个常见问题(脏读、不可重复读、幻读、丢失更新)。
  读已提交: Read Committed,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。 它解决了脏读问题,存在3个常见问题(不可重复读、幻读、丢失更新)。
  可重复读: Repeatable Read,就是在开始读取数据(事务开启)时,不再允许修改操作 。它解决了脏读和不可重复读,还存在2个常见问题(幻读、丢失更新)。
  序列化: Serializable,序列化,或串行化。就是将每个事务按一定的顺序去执行,它将隔离问题全部解决,但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

越高的隔离级别,能解决的数据一致性问题越多,但同时也会带来性能损耗、降低并发性。

 还是上面那个网站中,贴出了事务隔离机制对数据一致性三大问题的解决程度:

翻译过来看下具体说了什么:

上述的事务隔离级别对解决事务并发三大问题的效果如下表,可能就是未解决,不可能就是已解决。

看到这里,感觉可重复读RR模式于业务于性能来说是比较合适的,于是我便打开我的数据库来验证下默认的是什么:
查看系统隔离级别:select @@global.tx_isolation;
查看会话隔离级别(5.0以上版本):select @@tx_isolation;
查看会话隔离级别(8.0以上版本):select @@transaction_isolation;
果然,那么,RR,RC的事务隔离级别是怎么实现的,不讲很底层的原理,直接引入一个大概念,有两个: lbcc,mvcc模式。

lbcc:在读取数据前,对其加锁,阻止其他事务对数据进行修改。
mvcc: 生成一个数据请求时间点的一致性数据快照(Snapshot),并用这个快照来提供一定级别(语句级或事务级)的一致性读取。
很显然,lbcc模式,每次读取时都要对数据加锁,绝大多数场景下都是不现实的,所以一般使用的 解决读一致性的问题的方法是mvcc。

InnoDB的mvcc(Multi-Version Concurrency Control)逻辑:

暂时放下lbcc,我们来看看MVCC。

MVCC 的目的就是多版本并发控制,在数据库中的实现,就是为了解决读写冲突,它的实现原理主要是依赖记录中的 3个隐式字段,undo日志 ,Read View 来实现的。

在这里插入图片描述DB_ROW_ID 是数据库默认为该行记录生成的唯一隐式主键,DB_TRX_ID 是当前操作该记录的事务 ID ,而 DB_ROLL_PTR 是一个回滚指针,用于配合 undo日志,指向上一个旧版本 。

1.上面说到,mvcc是为数据生成一个readView,快照,我们可以理解为一个备份,这些插入更新删除等操作出来的备份存放在undolog日志中,以后每次访问都是来针对这个备份。

2.具体实现时依据一条规则:只能查找创建时间小于等于当前事务ID的数据,和删除时间大于当前事务ID的行(或未删除)

举例来看:

我有一条数据,id:1,name:吴彦祖。DB_TRX_ID版本为null

idnameDB_TRX_IDDB_ROLL_PTR原始数据
1吴彦祖nullnull

这时我开启一个事务,执行select语句,就叫这个过程为:看看我是谁,结果是:id:1,name:吴彦祖。但是DB_TRX_ID版本变为了1.

idnameDB_TRX_IDDB_ROLL_PTR我开启一个事务查看
1吴彦祖1null

这是又有一个事务在我查看事务后开启,执行了一条更新语句,更新结果如下,同时DB_TRX_ID版本变为了2,这时执行“看看我是谁”,结果不变还是吴彦祖,原因就是遵循上面的展示规则:只能查找创建时间小于等于当前事务ID的数据,和删除时间大于当前事务ID的行(或未删除)

版本变味了nameDB_TRX_IDDB_ROLL_PTR另一个事务开启了一个更新name操作
1mmm.c2null

这是又有一个事务开启了删除操作,将这条字段整个删掉了,这时DB_ROLL_PTR变为了4,但是这时执行“看看我是谁”,结果不变还是吴彦祖,原因还是:只能查找创建时间小于等于当前事务ID的数据,和删除时间大于当前事务ID的行(或未删除)。

idnameDB_TRX_IDDB_ROLL_PTR另一个事务开启了一个删除操作
1mmm.c34

所以说,在开启一个事务后,mvcc帮助我们模拟锁定了这个表,这个事务之后的一切操作都与这个事务无关。在Mysql中,Read Committed 和Read Repeatable Read隔离级别的一个非常大的区别就是它们生成ReadView的时机不同。在Read Committed中每次查询都会生成一个实时的ReadView,做到保证每次提交后的数据是处于当前的可见状态。而RepeaTable Read中,在当前事务第一次查询时生成当前的ReadView,并且当前的ReadView会一直沿用到当前事务提交,以此来保证可重复度(RepeaTable Read)。
这就是mvcc通过多版本的机制来实现数据库读一致性的解决方案。

个人学习笔记,欢迎大佬指正交流。

MySQL ACID与MVCC浅谈 MySQL ACID与MVCC浅谈 前言 我们都知道在做事务的概念,就是一个完整的操作动作要么都执行,要么都不执行,这是一个不可分割的工作单位,ACID又是事务的四大特征。那么ACID具体是什么呢? ACID介绍 原子性(atomicity) 一个事务必须被视为一个不可分割的最小工作单元,整个事务中即使包含几个步骤,但所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。 一致性(consistency) 一致性是指事务必须使数据库.. 阅读详情

相关推荐

GAMES101:MacOS作业环境搭建

查看gcc/clang的位置产看gcc/clang的版本1.1.2 安装cmake。

weixin_38844255的博客 715

【MySQL面试专题二】 MVCC是什么?如何解决一致性问题?

问题一:MySQL 的事务隔离级别有哪些?分别用于解决什么问题? 脏读:一个事务读取到另一个事务还未提交的数据。 不可重复读:在一个事务中多次读取同一个数据时,结果出现不一致。 幻读:在一个事务中使用相同的 SQL 两次读取,第二次读取到了其他事务新插入的行。 不可重复读注重于数据的修改,而幻读注重于数据的插入。 问题二、MySQL 为什么默认隔离级别采用可重复读?如何实现的? 采用可重复读,可以避免脏读和不客重复的读。使用 MVCC 实现的,即 Mutil-Version Concu...

u012272367的博客 1746

AU混响终极指南:从‘干声’到‘空间感’,用总音轨和发送技巧打造专业人声

本文详细介绍了如何在Adobe Audition(AU)中使用混响效果器,通过总音轨和发送技巧将‘干声’转化为具有专业‘空间感’的人声。从混响基础原理到总线架构设置,再到精细控制和自动化调整,全面解析了提升音频质量的实用技巧,适用于音乐制作、播客和内容创作。

weixin_30512089的博客 331

MySQL的MVCC多版本并发控制

为了解决在并发访问数据库系统时在保证数据一致性的情况下同时不降低读写效率而存在的技术对于使用 InnoDB 存储引擎的表来说,它的聚簇索引记录中都包含两个必要的隐藏列trx_id :每次一个事务对某条聚簇索引记录进行改动时,都会把该事务的 事务id 赋值给 trx_id 隐藏列。roll_pointer :每次对某条聚簇索引记录进行改动时,都会把旧的版本写入到 undo日志 中,然后这个隐藏 列就相当于一个指针,可以通过它来找到该记录修改前的信息。数据库每次对记录的改动都会生成一个undo日志,将旧记录放入

运气只是当机会来临时,你已为它准备好。 276

10分钟训练你的AI歌手:RVC WebUI声音克隆保姆级教程

本文提供了一份详细的RVC WebUI声音克隆保姆级教程,指导用户如何在10分钟内利用Retrieval-based-Voice-Conversion技术训练专属AI歌手。教程涵盖从环境配置、数据准备、模型训练到最终推理应用的全流程,即使是新手也能快速上手,实现高质量的声音克隆与歌曲生成。

weixin_29073241的博客 818

windchill安装搭建(保姆式)

保姆式搭建windchill 材料准备 Vmware工具,用来创建和打开虚拟机的工具 安装系统的镜像文件 数据库安装文件,这里是Oracle数据库 Windchill的安装包 Vmware工具,用来安装和打开虚拟机的软件 Windowsserver2008的镜像工具,用来安装虚拟机环境的系统,如果你有win2007或win2010的也可以,在做虚拟机时,需要先安装系统。 Oracle数据库安装包 Windchill11M030的安装包 (安装包如有需要可以私信邮箱发送) 虚拟机安装 安装虚拟机VMware

tr1294937662的博客 6217

MySQL MVCC机制探秘:数据一致性与并发处理的完美结合,助你成为数据库高手

MVCC全称 Multi-Version Concurrency Control ,即多版本并发控制,MVCC 是一种并发控制的方法,一般在数据库管理系统中实现对数据库的并发访问,在编程语言中实现事务内存。多版本控制:指的是一种提高并发的技术,在最早的数据库系统中只有读-读之间可以并发,读-写、写-写之间都要阻塞。引入多版本并发控制之后,只有写-写之间相互阻塞,其他三种操作都可以并行,这样大幅的提高了 InnoDB 的并发度。

资料免费分享,点击名片 710

Android AudioFlinger(一)——初识AndroidAudio Flinger

AudioFlinger 是 Android 系统中的音频中间层(audio HAL, Audio Hardware Abstraction Layer)的一部分,负责管理音频的混音、播放和音量控制等功能。它充当 Android 应用程序和音频硬件之间的桥梁。

hirezy 1666

关于MySQL如何使用MVCC(多版本控制)来保证在并发的情况下数据的一致性

MySQL的大多数事务型存储引擎实现的都不是简单的行级锁。基于提升并发性能的考虑,它们一般都同时实现了MVCC(即多版本并发控制);其实不仅是MySQL,包括Oracle等其他的数据库系统也都实现了MVCC,各自实现的机制也都不尽相同,因为MVCC并没有一个统一的实现标准。 简单说一下何为MVCC,多版本并发控制可能有点过于书面难以理解,其实可以看做是行级锁的一个...

lj961030的博客 1016

STM32实战开发(71):STM32人脸识别开发教程:基于摄像头模块的人脸识别系统

在嵌入式系统中,STM32凭借其强大的计算性能、丰富的外设接口以及低功耗特性,成为了实现人脸识别系统的理想平台。STM32虽然没有强大的计算能力,但可以通过合理利用外部硬件加速模块,如DSP、GPU、FPGA等,结合轻量级的人脸识别算法,实现高效的人脸识别系统。尽管STM32的计算资源相对有限,但通过合理的优化和使用高效的算法,我们依然能够实现高效的人脸识别功能。在本项目中,我们使用。在STM32开发中,虽然处理能力有限,但通过优化算法和合理利用硬件加速,我们仍然可以实现一个轻量级的、实时的人脸识别系统。

2201_76125393的博客 1662

即梦(Dreamina)技术浅析(六):多模态生成模型

多模态生成模型的目标是结合不同模态的数据(如文本和图像),生成新的视觉内容。其核心思想是利用文本描述引导图像或视频的生成过程,使得生成结果能够准确反映用户的意图。

m0_75253143的博客 1333

MySQL学习日志(三)—— 事务、锁、MVCC

MySQL执行计划 Explain id:表示sql语句非常复杂, select_type: table: partitions: type:表示查询对应的类型

qq_38058050的博客 248

starrc: LEF DEF FLOW与full chip flat netlist

SIKP_CELLS默认为"SKIP_CELLS: *"意思是跳过所有ref cell内部的rc提取,仅提取cell之间的互联线的rc,"SKIP_CELLS: *!与MACRO_DEF_FILE搭配使用的还有SKIP_CELLS命令,如果想提取block的寄生参数生成full chip的flat netlist,或者跳过block取执行hier的寄生参数提取都需要用到SKIP_CELLS。此时,macroA和macroB没有被跳过,所以提取其内部的rc,spef中存在两个A和两个B。

m0_61544122的博客 552

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

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

船到桥头自然直 5300

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

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

nplplus的博客 6232

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【MySQL】MVCC是如何解决快照读下的幻读问题的

我们从上文中了解到 InnoDB 默认的事务隔离级别是 repeatable read(后文中用简称RR),它为了解决该隔离级别下的幻读的并发问题,提出了 LBCC 和 MVCC 两种方案。其中 LBCC 解决的是当前读情况下的幻读,MVCC 解决的是普通读(快照读)的幻读。至于什么是当前读,什么是快照读,将在文中给出答案。

阿Q的小窝 3939

Mysql中事务的读一致性问题,以及如何用MVCC解决

原子性事务具有回滚的能力,InnoDB引擎使用undo log日志表来进行回滚操作。持久性InnoDB引擎使用redo log日志表来保证数据的持久性。mysql数据库的隔离级别: Read Uncommitted (读未提交),未解决任何并发问题,事务未提交的数据对其他事务也是可见的,会出现脏读。 Read Committed (已提交读),解决脏读问题,一个事务开始之后,只能看到已提交的事务所做的修改,会出现不可重复读。 Repeatable Read

m0_73864806的博客 1758

MySQL事务并发问题和MVCC机制

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

qq_66627105的博客 1641

【MySQL】深入解析事务与MVCC

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

保持学习 1348

MySQL事务隔离级别的实现原理MVCC

MVCC(Multi-Version Concurrency Control),即多版本并发控制,是并发读写场景下,数据库层面提供的一种解决方案。读读当多个事务同时进行读取操作时,它们之间不存在资源竞争,不会产生任何问题。因为读取操作并不会对数据进行修改。读写在这种场景下,一个事务进行读取操作,另一个事务进行写入操作,可能会引发一系列数据一致性问题,如脏读(读取到其他事务未提交的数据)、不可重复读(在同一事务中多次读取同一数据结果不同)以及幻读(事务执行过程中出现新的符合条件的数据)。

weixin_45593273的博客 3341

MySQL之事务一致性,日志,MVCC

文章目录1 MySQL函数1.1 字符串函数1.2 数值函数1.3 日期函数1.4 系统信息函数2 事务3 MySQL日志3.1 二进制日志3.2 错误日志3.3 通用查询日志3.4 慢查询日志 1 MySQL函数 1.1 字符串函数 连接字符串 concat('a','b'); concat_ws(',','2021','04'); 是带连字符的字符串连接 比较字符串大小函数(实际是ascii码值比较) select strcmp('a','b'); --返回 1(大于)或者-1(小于)或者0(相等)

上善若泪 2180

什么是MySQL 事务与 MVCC 原理?

作者:小林coding 图解计算机基础网站:https://xiaolincoding.com/ 大家好,我是小林。 之前写过一篇 MySQL 的 MVCC 的工作原理,最近有读者在网站上学习的时候,评论区指出了一些问题。 而这个知识点很重要,面试太常问了,所以,我就重写了这篇文章!开车! 正文 这是我的钱包,共有 100 万元。 今天我心情好,我决定给你的转账 100 万,最后的结果肯定是我的余额变为 0 元,你的余额多了 100 万元,是不是想到就很开心? 转账这一动作在程序里会涉及到一系列的..

小林coding 4590

Mysql事务---MVCC详解

Mysql数据库事务隔离级别? SQL 标准定义了四个隔离级别: READ-UNCOMMITTED(读取未提交): 事务的修改,即使没有提交,对其他事务也都是可见的。事务能够读取未提交的数据,这种情况称为脏读。 READ-COMMITTED(读取已提交): 事务读取已提交的数据,大多数数据库的默认隔离级别。当一个事务在执行过程中,数据被另外一个事务修改,造成本次事务前后读取的信息不一样,这种情况称为不可重复读。 REPEATABLE-READ(可重复读): 这个级别是MySQL的默认隔离级别,它解决了脏读

weixin_43875870的博客 3624

MVCC 原理分析、MySQL是如何解决幻读的

为什么使用MVCC,MVCC原理分析,当前读、快照读,TRX_ID、ROLL_PTR,undo log、版本链,Read View读视图、版本链数据的访问规则,MySQL如何解决幻读,记录锁、间隙锁、next-key锁

qq_44700578的博客 3618

mysql 事务之LBCC与MVCC

数据库事务(Database Transaction)是数据库管理系统(DBMS)中执行的一系列操作,这些操作被当作一个逻辑单元进行处理,以保证数据的一致性和完整性。

weixin_44550507的博客 1631

MySQL 事务隔离级别与 MVCC 深度解析

本文系统讲解了 MySQL 的事务隔离级别,从读未提交到串行化逐一分析其特性与并发问题,并深入剖析了 InnoDB 默认的可重复读隔离级别。在此基础上,重点讲解了 MVCC 的工作原理、Read View 的可见性判断机制,以及 MySQL 如何通过锁定读与 Next-Key Lock 解决幻读问题,帮助读者从原理层面真正理解 MySQL 的事务并发控制设计。

往者之不谏 来者犹可追 1309
上一篇: easyUI的使用.datagrid()生成列表日期时间显示异常,一个方法带入有效修复
下一篇: mybatis中大于等于,小于等于,like等特殊符号写法
mmm.c
博客等级 码龄9年 117粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值