Mysql事务的实现原理_mysql事务怎么实现的-程序员宅基地

技术标签: Powered by 金山文档  服务器  mysql  数据库  分布式事务  

核心日志

1、Redo Log

2、Undo Log

3、BinLog


redoLog,保持继续执行恢复没有写入的功能日志,物理日志,innoDB独有。

undoLog,回滚操作,生成与执行相反的逻辑日志,且提前会有快照放在undoLog里面,有备份。

BinLog,二进制日志,mysql自身日志,主要是主从复制,数据恢复(使用mysqlbinlog)。

1、事务的实现原理

继续解析:

Mysql的事务实现,离不开RedoLog和UndoLog.

ACID

A(原子性 Atomicity),D(持久性 Durability),是由redoLog实现的

C(一致性,Consistency)是有undoLog执行的,保证失败可以回滚。

I(隔离性,isolation):隔离性是由锁和MVCC机制实现的。 一个悲观锁,一个乐观锁,每个都能找到相应的原数据。

1.1 RedoLog:

1、基本原理:

redoLogBuffer ->持久化,redoLog file ->(已经提交,还没写入IBD文件的数据)

2、刷盘规则:

Redo Log Buffer(是存放在操作系统的用户空间中) ->通过操作系统的内核空间缓冲区(OS buffer)-> fsync()->logfile

有一个O_DIRECT标志位,可以不通过OS BUFFER。但是redoLog没有使用。

物理日志,顺序循环,最后一个文件写满会向第一个文件写数据,也就是覆盖写。

3、RedoLog的LSN机制

log sequence number(日志的逻辑序列号,8字节的存储空间,单调递增)

1)RedoLog写入数据的总量

2)检查点位置

3)数据页版本相关的信息

机制

每个数据页,表头有一个fil_page_lsn,记录当前最终的LSN值。

将数据页的LSN与RedoLog的LSN值比较,如果数据页小于log,就是表示丢失了一部分数据,这个时候就用redolog来恢复数据,不然就不恢复。

1.2 Undo Log

作用:

  • 回滚事务

  • 多版本并发事务(MVCC)

发生:

启动事务之前,修改的数据记录存储到UndoLog中,如果事务回滚或MySql数据库崩溃,可以利用 UndoLog对没有提交的事务进行回滚,保证数据库的数据一致性。

UndoLog消失

undoLog产生于事务开始前,提交不会立刻删除,会放到待删除列表,让purge thread进行删除处理

undoLog机制

逻辑日志,

1)数据库执行insert,undoLog记录一条Delete;

2)数据库执行一条Delete,UndoLog会记录一条对应的Insert语句;

3)当数据库执行一条update语句时,undoLog会记录一条相反的update语句。???

UndoLog需要持久化,会产生redoLog。

undoLog的可靠性和完整性需要RedoLog来保证;

因此数据库崩溃先做RedoLog数据恢复,然后做UndoLog回滚。

1.2.1 UndoLog基本原理

都需要经过OS Buffer持久化。

如果日志中,设置了O_DIRECT的标志位,可以不经过OS BUFFER。

1.2.2 实现MVCC机制

多版本控制(MVCC)

1、提交之前,向UndoLog保存事务当前的数据,这些保存到UndoLog的旧版本数据可以作为快照供其他并发事务进行快照读。

2、select语句查询的数据被其他事务锁定,可以从UndoLog分析出当前数据之前的版本,从而向客户端返回之前的数据。

undo 回滚段,分为 insert 和 update;

1)insert undo log:事务对插入新记录产生的undo log,只在事务回滚时需要,在事务提交后可以立即丢弃。(但是没有丢吧?有点问题)

2)update undo log:进行删除和更新操作产生的undoLog,不仅回滚需要,一致性读也需要,因此不能随便删除,只有当数据库所使用的快照不涉及该日志记录,对应的回滚日志才会被purge线程删除。

可重复读隔离级别:MVVC

数据库每行数据后面添加了3个字段,

  • 6字节的事务id(DB_TRX_ID)字段;记录最后一次修改本行记录的事务id

  • 7字节的回滚指针(DB_ROLL_PTR)字段, 指向上一个版本的行记录(通过undo 找到相应的数据)

  • 6字节的DB_ROW_ID字段。(聚集索引行id)

1.3 BinLog

binlog,二进制日志。

记录mysql所有数据库表结构变更和表数据变更的二进制日志。

  • 不会记录注入select和show这类查询操作的日志 。

  • 同时,以事件形式记录相关变更操作的,并且包含语句执行消耗的时间。

1.3.1 重要使用场景

  • 主从复制:开启BinLog,主数据库把BinLog发送到从数据库,从数据库获取BinLog,

通过IO线程将日志写到中继日志,也就是RelayLog。通过sql线程将relayLog中的数据同步到从数据库,达到主从数据库的一致性。

  • 数据恢复:mysql数据库故障或者崩溃, BinLog进行数据恢复,例如可以使用mysqlbinlog等工具进行数据恢复

1.3.2 BinLog记录模式

1)Row

记录每一行,非常清楚记录每一行的修改情况。

  • 优点:完全实现主从同步和数据恢复

  • 缺点: 大批量操作,二进制内容日志暴涨,影响主从数据库的同步性能

2)Statement

记录每一条修改数据的sql语句。

SQL进程将BinLog中的sql语句解析成和Mysql主数据库中执行过的sql语句相同的sql语句,然后在从数据库执行SQL进程解析出来的sql语句。

  • 优点:不记录数据的修改细节,只是记录数据表结构和数据变更的sql语句,产生日志小,减少IO操作,提高数据存储和恢复的效率。

  • 缺点:某些情况,主从不一致。比如主数据库使用了last_insert_id(),和now()等函数,会导致mysql主从数据库中的数据不一样。

3)Mixed

row和statement一起用。

使用Statement模式保存BinLog,存在state模式无法复制的操作,例如使用last_insert_id(),和now()等函数,会使用Row模式。

Mysql会根据执行的sql语句选择写入的记录模式

1.3.3 BinLog文件结构

各种更新操作。

修改操作:Log Event

Query Event,Row Event, Xid Event。

文件结构,

timestamp,type_code,server_id,event_length,next_position,flags,extra_headers

1.3.4 BinLog写入机制

先记录BinLog 二进制日志,再记录事务日志。

BinLog就是各种日志事件的集合。

操作:

1)根据记录的模式(Row,Statement,Mixed)和操作(create,drop,alter,insert,update)等触发事件,生成日志事件(事件触发执行机制)

2)将日志事件写入相应的缓冲区(binlog_cache_mngr),

这个数据结构有两个缓冲区,一个是stmt_cache,不支持事务的信息;

一个是trx_cache,用于存放支持事务的信息。

3)事务commit阶段,会将日志文件写入磁盘的BinLog中。

不同的事务会以串行的方式将日志事件写入BinLog,所以一个事务包含的日志事件在BinLog文件中是连续的,中间不会插入其他事务的日志事件。

综上,一个事务的BinLog是完整的,并且中间不会插入其他事务的BinLog

1.3.5 BinLog的组提交机制

提高Mysql日志刷盘的效率,Mysql数据库提供了组提交(group commit)的功能。

通过组提交功能,调用一次fsync()函数将多个事务的日志刷新到磁盘的日志文件中,而不是单个事务的日志单独刷新,提升刷盘效率。

提交事务。

两个阶段的操作:

  • 修改内存中的事务信息,并且写入相应的RedoLogBffer

  • 调用fsync(),将redo log buffer中的日志信息刷新到磁盘的Redo log文件中。

BinLog,5.6之前会失效,mysql需要保证binlog 和事务日志的一致性,使用了两阶段事务。

1)事务提交,Innodb 存储引擎需要进行prepare操作。

2)将更新写入BinLog操作。

3)将事务日志写入RedoLog。

保证一致性的话,prepare阶段,会启用一个prepare commit mutex锁,会导致开启二进制日志后 组提交功能 失效。

5.6之后。

会将事务按照一定的顺序放入一个队列当中,第一个事务称leader,其他事务叫follower.

移除了prepare commit mutex锁。

实现方式成为 二进制日志组提交(Binary Log Group Commit)BLGC.

1) flush,将每个事务的BinLog写入对应的内存缓冲区

2)sync,将内存缓冲区的binlog写入磁盘的binlog,如果队列有多个事务,此时只执行一次刷盘操作就可以将多个事务的binlog刷新到磁盘的binlog。

3)commit,leader事务根据队列中事务的顺序调用的存储引擎层事务的提交操作。

2 Mysql事务流程

2.1 mysql事务执行流程

MySQL Innodb Engine--DML操作时先生成Undo Log还是先生成Redo Log

答案:先生成Undo Log,再生成Redo Log。

在生成Undo Log并写入到Undo Space时,会产生Redo Log。

在故障恢复时,可以通过Redo Log来恢复Undo Log,再通过Undo Log来回滚事务。

2.2 Mysql事务恢复流程

事务提交之前GG,

会先使用RedoLog,先做恢复数据,然后使用undolog回滚数据,

事务提交之后GG,

会使用redoLog恢复数据。

先恢复看看,如果提交了就结束

没有提交就undo.

2.3 Mysql的XA事务

mysql5.0.3版本支持XA事务,只有Innodb支持。 connector/j 5.0.0版本之后支持XA事务。

2.4 XA事务的基本原理

XA事务支持不同数据库之间实现分布式事务。

XA事务其实是二阶段提交的分布式事务。

使用XA事务,数据库事务隔离级别需要设置成串行化。

XA事务组成:

  • 事务管理器 控制所有事务的协调者。

  • 资源管理器 所有数据库连接。

  • 应用程序

2.5 XA事务语法

查看存储引擎是否支持XA事务

show engines \G

XA STARTXA END xidXA PREPARE xidXA COMMIT xidXA ROLLBACK xidXA RECOVER (查询)

XA事务使用XID标识分布式事务,xid主要由以下几部分组成。

xid:gtrid [,bqual[,format Id]]

gtrid: 必须,字符串,表示全局事务标识符

bqual:可选,字符串,默认空串,表示分支限定符,

formatId:可选,默认1,用于标识gtrid和bqual值使用的格式,

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33472553/article/details/129311508

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法