Mysql事务实现原理

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 1)BinLog是Mysql本身就有的,不管使用哪种引擎,都会存在BinLog,而Redo Log是InnoDB引擎特有的。2)BinLog是一种逻辑日志,记录的是对数据库的所有修改操作,而RedoLog是一种物理日志,记录的是每个数据页的修改。3)BinLog具有幂等性,而Redo Log不具有幂等性。4)BinLog开启事务时,会将每次提交的事务一次性写入内存缓冲区,如果未开启事务,则每次成功执行插入、更新和删除语句时,就会将对应的事务信息写入内存缓冲区修改数据,而Redo Log是在数据准备之前将数据写入缓冲区的Redo Log中,然后在缓冲区中修改数据。而且在提交事务时,先将Re

一、Redo Log

Mysql中的事务的原子性和持久性是由Redo Log实现的。Redo Log也被称为重做日志。Redo通常用来记录物理日志。Redo Log包含两部分:

Redo Log Buffer:内存中的日志缓冲,易丢失

Redo Log File: 存放在磁盘中的重做日志,不易丢失

Redo Log四种刷盘规则:

1)通过innodb_flush_log_at_trx_commit决定,其中:

    1的性能最差,即使崩溃,也不会丢失日志

    0是每1s写入日志

    2是每秒写入到buffer中,然后通过fsync同步

2)通过刷新日志频率:innodb_flush_log_at_timeout的值决定

3)当Log Buffer中已经使用的内存超过一半时,也会触发

4)当事务中存在checkpoint时,在一定程度上代表刷写到磁盘日志所在的LSN位置

LSN:日志的逻辑序列号,占8个字节

二、Undo Log

Mysql的一致性由undo log实现的。undo log在Mysql事务的实现中主要作用:回滚事务多版本并发事务 MVCC在Mysql启动事务之前,会先将要修改的数据存储到undo log中。如果事务发生回滚或数据库崩溃,可以利用undo log对数据库中未提交的事务进行回滚操作,从而保证数据的一致性。undo log也会产生Redo Log。由于undolog的完整性和可靠性需要Redo Log来保证。数据库崩溃时,先做Redo Log数据恢复,然后做Undo Log 。

undo Log在Mysql中采用段的方式进行管理,在数据库文件中存在一种叫rollback segment的回滚段,在这个回滚段内部存在1024个undo log segment段。undolog默认存储在共享数据表空间中,默认为idata1文件中。

undo log回滚段中,undo logs分为:

insert undo log(插入)

update undo log(更新和删除)

MVCC:在数据表后面保存了两个隐藏列,保存行的创建版本、保存行的删除版本

DB_TRX_ID、DB_ROLL_PTR、DB_ROW_ID

三、BinLog

一种记录所有Mysql数据库表结构变更以及表数据变更的二进制日志。BinLog的使用场景:主从复制数据恢复

BinLog记录的模式:

row

statement

mixed

row模式:Row模式下的BinLog文件会记录每一行数据被修改情况,然后在mysql从数据库中对相同的数据进行修改。会记录每一行修改的情况。

statement模式:BinLog文件会记录每一条修改数据的Sql语句,Mysql从数据库在复制sql语句的时候,会通过sql进程将BinLog中的sql语句解析成和mysql主数据库执行过的sql语句相同的sql语句,然后在从数据库上执行sql进程解析出来的sql语句。记录数据修改的sql语句。

mixed模式:是row和statement模式的混合。

通常情况下,采用mixed模式mysql的BinLog文件中保存了数据库、数据库表和数据表中的数据的各种更新操作。用来表示修改操作的数据结构叫做日志事件。比较常见的日志事件:Query Event、Row Event、Xid Event等。

BinLog的写入机制:mysql事务提交的时候,会记录事务日志和BinLog日志。其中BinLog日志先于事务日志Redo Log。

根据日志记录模式和操作触发生成日志事件。

在InnoDB存储中,提交事务时,一般会进行两个阶段的操作。

1)修改内存中事务对应的信息,并将日志写入相应的Redo Log Buffer。

2)调用fsync()函数将Redo Log Buffer中的日志信息刷新到磁盘的Redo Log文件中。

四、Bin Log和Redo Log的区别

1)BinLog是Mysql本身就有的,不管使用哪种引擎,都会存在BinLog,而RedoLog是InnoDB引擎特有的。

2)BinLog是一种逻辑日志,记录的是对数据库的所有修改操作,而RedoLog是一种物理日志,记录的是每个数据页的修改。

3)BinLog具有幂等性,而RedoLog不具有幂等性。

4)BinLog开启事务时,会将每次提交的事务一次性写入内存缓冲区,如果未开启事务,则每次成功执行插入、更新和删除语句时,就会将对应的事务信息写入内存缓冲区修改数据,而RedoLog是在数据准备之前将数据写入缓冲区的RedoLog中,然后在缓冲区中修改数据。而且在提交事务时,先将RedoLog写入缓冲区,写入完成后再提交事务。

5)BinLog只会在事务提交时,一次性写入BinLog,其日志的记录方式与事务的提交顺序有关。

6)BinLog是追加写入。RedoLog是循环写入,日志空间的大小是固定的。

7)BinLog一般用于主从复制和数据恢复,并且不具备崩溃自动恢复的能力,而RedoLog是在服务器发生的故障后重启Mysql,用于恢复事务已提交但未写入数据表的数据。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
9天前
|
SQL 关系型数据库 MySQL
MySQL 事务回滚。在执行删除、更新等操作时,防止误操作
MySQL 事务回滚。在执行删除、更新等操作时,防止误操作
22 2
|
4天前
|
存储 SQL 关系型数据库
深入MySQL锁机制:原理、死锁解决及Java防范技巧
深入MySQL锁机制:原理、死锁解决及Java防范技巧
|
4天前
|
存储 SQL 关系型数据库
深入解析MySQL事务机制和锁机制
深入解析MySQL事务机制和锁机制
|
6天前
|
算法 关系型数据库 MySQL
一天五道Java面试题----第七天(mysql索引结构,各自的优劣--------->事务的基本特性和隔离级别)
这篇文章是关于MySQL的面试题总结,包括索引结构的优劣、索引设计原则、MySQL锁的类型、执行计划的解读以及事务的基本特性和隔离级别。
|
19天前
|
SQL canal 关系型数据库
(二十四)全解MySQL之主从篇:死磕主从复制中数据同步原理与优化
兜兜转转,经过《全解MySQL专栏》前面二十多篇的内容讲解后,基本对MySQL单机模式下的各方面进阶知识做了详细阐述,同时在前面的《分库分表概念篇》、《分库分表隐患篇》两章中也首次提到了数据库的一些高可用方案,但前两章大多属于方法论,并未涵盖真正的实操过程。接下来的内容,会以目前这章作为分割点,开启MySQL高可用方案的落地实践分享的新章程!
127 1
|
20天前
|
SQL 关系型数据库 MySQL
(七)MySQL事务篇:ACID原则、事务隔离级别及事务机制原理剖析
众所周知,MySQL数据库的核心功能就是存储数据,通常是整个业务系统中最重要的一层,可谓是整个系统的“大本营”,因此只要MySQL存在些许隐患问题,对于整个系统而言都是致命的。
|
20天前
|
SQL 算法 关系型数据库
(十)全解MySQL之死锁问题分析、事务隔离与锁机制的底层原理剖析
经过《MySQL锁机制》、《MySQL-MVCC机制》两篇后,咱们已经大致了解MySQL中处理并发事务的手段,不过对于锁机制、MVCC机制都并未与之前说到的《MySQL事务机制》产生关联关系,同时对于MySQL锁机制的实现原理也未曾剖析,因此本篇作为事务、锁、MVCC这三者的汇总篇,会在本章中补全之前空缺的一些细节,同时也会将锁、MVCC机制与事务机制之间的关系彻底理清楚。
|
2天前
|
canal 关系型数据库 MySQL
"揭秘阿里数据同步黑科技Canal:从原理到实战,手把手教你玩转MySQL数据秒级同步,让你的数据处理能力瞬间飙升,成为技术界的新晋网红!"
【8月更文挑战第18天】Canal是一款由阿里巴巴开源的高性能数据同步系统,它通过解析MySQL的增量日志(Binlog),提供低延迟、可靠的数据订阅和消费功能。Canal模拟MySQL Slave与Master间的交互协议来接收并解析Binary Log,支持数据的增量同步。配置简单直观,包括Server和Instance两层配置。在实战中,Canal可用于数据库镜像、实时备份等多种场景,通过集成Canal Client可实现数据的消费和处理,如更新缓存或写入消息队列。
29 0
|
5天前
|
算法 关系型数据库 MySQL
一天五道Java面试题----第七天(mysql索引结构,各自的优劣--------->事务的基本特性和隔离级别)
这篇文章是关于MySQL的面试题总结,包括索引结构的优劣、索引设计原则、MySQL锁的类型、执行计划的解读以及事务的基本特性和隔离级别。
|
7天前
|
SQL 安全 关系型数据库
Go 语言中的 MySQL 事务操作
在现代应用中,确保数据完整与一致至关重要。MySQL的事务机制提供了可靠保障。本文首先解释了事务的概念及其ACID特性,随后介绍了如何在Go语言中使用`database/sql`包进行MySQL事务操作。通过一个银行转账的例子,演示了如何通过Go开启事务、执行操作并在必要时回滚或提交,确保数据一致性。最后,还讨论了不同事务隔离级别的含义及如何在Go中设置这些级别。通过本文的学习,开发者能更好地掌握MySQL事务的应用。
12 0