请你来了解一下Mysql-InnoDB中事务的两段式提交

这篇具有很好参考价值的文章主要介绍了请你来了解一下Mysql-InnoDB中事务的两段式提交。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

欢迎订阅专栏,了解更多Mysql的硬核知识点,原创不易,求打赏

ACID:事务的四个特性

A:原子性

原子性表示把一个事务中所有的操作视为一个整体,要么全部成功,要么全部失败,是事务模型区别文件系统的重要特征之一

C:一致性

官方对一致性的解释为事务将数据库从一种状态转变为下一种一致性状态,在事务开始之前和食物结束以后,数据库的完整性约束没有被破坏。

而我对一致性的理解为事务的执行可以让各方在指定规则下都认可这个事务产生的变更。比如事务提交后将数据写入binlog,事务提交后redo会写入prepare,commit状态的数据,undo会维护该版本的数据,数据写入(聚集,非聚集)索引表等等。

就好像DDD中的限界上下文一样,大家对于这个领域的边界有共同且明确的认知

InnoDB事务的两段式提交中,主要就是对原子性和一致性的保证。

I:隔离性

隔离性基本的理解是事务之间不会互相干扰。但这是结果。通过什么方式可以使得事务的执行不会互相干扰呢?

如果数据库只允许串行化执行事务,那么就没有隔离性什么事,但是现在的社会,连人类都得加班,互卷,为了让自己的业绩,考核能够更好。对于数据库来说,不可能让一个数据库慢慢悠悠的执行事务,支持并发事务执行是必须的也是基本的职能(功能)。

因此系统必须支持事务的并发执行,事务的并发执行为了保证“线程安全”,必须通过一些手段让其操作在一定的限界内,不能让它们逾越法则。

所以就有了并发控制,锁的出现,通过并发控制,可以让相应的可读数据划分边界,对于不可读的内容做了屏蔽。通过锁,可以让对于同样数据的多个并发修改得以强制性串行执行。

D:持久性

需要注意的是持久性并不能保证机器物理级别的损坏(包括很多方便)或者山崩地裂导致服务器沉入大海后还要做数据恢复。针对这种情况还需要一些高可用的架构来辅助完成。

持久性保证的除了上面说的几种情况外,只要事务单方面确认提交了,那么就能够通过一些手段来恢复。

事务提交的过程图

请你来了解一下Mysql-InnoDB中事务的两段式提交,MYSQL,mysql,两段式提交,事务,ACID,InnoDB

过程解释

其两段式提交主要就是在redo.log的两次prepare状态和commit状态。但是记住,并不是只有最后commit状态写入了才能恢复

假如redo.log中写入了prepare状态的数据,并且bin.log也写入了。但是写redo.log的commit状态的数据时丢失了,这时候还是可以恢复的。(那为什么不能只根据bin.log是否写入来判断事务成功,为什么还要有一个redo.log来增加复杂度呢?)

因为bin.log太大了,如果系统恢复是通过bin.log来恢复,首先功能是没问题的,但是恢复的时间会很长。而redo.log很小啊(默认情况下只有48M),只需要遍历redo.log里面的数据,如果是commit状态的那么直接恢复。如果是prepare状态的,那么看一下bin.log有没有,有就恢复,没有就不恢复。

事务执行的效率

事务执行的效率除了受限于事务的大小等因素以外,还受限于磁盘的性能,为什么这么说呢?

因为默认情况下,每次都必须等到数据写入磁盘才表示事务提交成功,要不然中间如果出现问题,导致数据并没有写入redo.log或者bin.log,直接返回状态,那么必然有数据不一致性问题。

innodb控制这个过程是通过innodb_flush_log_at_trx_commit参数控制的。

0:每次事务提交的内容不写入文件,而是由master thread进行。master thread中每秒都会执行一次fsync操作

1(默认值)每次事务提交的内容必须执行一次fsync刷到磁盘,才会标记事务为成功。

2:每次事务提交的内容只写入文件系统的缓存,不进行fsync操作。

文件系统的缓存中数据写入文件几乎依赖的是操作系统的一些机制了

  • 脏数据回写策略:当文件系统缓存中的数据被修改后,会被标记为"脏"数据(dirty data)。文件系统会定期或在内存压力紧张的情况下(内核调度策略),将这些"脏"数据异步写入文件。

  • 超过内核参数设置的阈值:Linux内核有一些参数可以控制文件系统的回写行为,例如dirty_ratiodirty_background_ratio。当"脏"数据占用内存的比例超过dirty_ratio或超过dirty_background_ratio时,内核会触发异步回写操作。

  • 内核定期回写:内核中有一个脏数据回写线程 (pdflush 或 bdflush),它会定期(默认30秒)检查文件系统的缓存,将脏数据异步写入文件。

需要注意的是master thread执行fsync是固定有的功能,和事务本身的fsync并不互斥的。也就是说有时候不等本事物执行fsync,就已经让master执行了,并且master thread是每个表空间特有的线程,因此如果某个表有单独的表空间,那么其事务提交就完全靠它自己了

无论是0还是2,都不具备事务特性中的一致性,因为数据的提交变的不可预知

bin.log和redo.log的数据顺序一致吗?

那有一个问题了,bin.log和redo.log的写入顺序是不是就是一致的呢?是不是下面的这种呢

请你来了解一下Mysql-InnoDB中事务的两段式提交,MYSQL,mysql,两段式提交,事务,ACID,InnoDB

其实并不是,因为bin.log的写入是在事务完成后一次性写入的,而redo.log可能在事务执行过程中不断地写入

有可能是下面的这种顺序

请你来了解一下Mysql-InnoDB中事务的两段式提交,MYSQL,mysql,两段式提交,事务,ACID,InnoDB

bin.log和redo.log 的数据格式一样吗? 

bin.log全程是binary log,记录的是对应的sql语句,是一个二进制文件

redo.log是一个物理格式数据,记录的是对每一个页的修改

延伸

redo.log的结构

redo.log的大小默认是48M,并且是由一个个redo log block组成的。一个redo log block的大小是512字节,所以默认情况下总有48MB / 512B = 98304个redo log block。

有没有发现redo log block的512字节的大小和磁盘扇区的大小是一样的,所以对于redo log block来说是可以保证原子性的,不需要doublewrite技术

请你来了解一下Mysql-InnoDB中事务的两段式提交,MYSQL,mysql,两段式提交,事务,ACID,InnoDB

一个redo log block最多可以存储492字节的数据,如果超过了492字节,就会被分配到下一个redo log block。那如果有多条日志都很小,比如10个字节,那么一个redo log block会包含多条日志,那怎么区分每个日志的初始位置呢?

通过LSN可以记录每个页写入重做日志时的LSN的大小。前面说过重做日志记录的是对页的修改,所以在页的数据结构中也有FIL_PAGE_LSN来记录该页的LSN

请你来了解一下Mysql-InnoDB中事务的两段式提交,MYSQL,mysql,两段式提交,事务,ACID,InnoDB

如果重做日志记录到LSN=3906时突然宕机了,并且事务提交了,这时候last checkpoint at=3696,log sequence number=3906,也就是右边的两个页没有实际应用到页里面(也就是事务的结果没最终落地),数据库恢复时,就会吧那两个页应用到对应页中。

Log Sequence number:表示当前的LSN

Log flushed up to:表示刷新到重做日志文件的LSN

Last checkpoint at:表示刷新到磁盘的LSN

数据库恢复时,只需要从Last checkpoint at的位置开始恢复就可以,也就是上面讲的例子 

redo.log的写入特点

从上面的图示中可以看出,redo.log是顺序写的,顺序写的好处就是每次写的时候会用做磁盘寻址,就相当大程度的提高写入效率。这一点很多中间件都会有使用到,比如RocketMQ,Kafka等数据的写入

 文章来源地址https://www.toymoban.com/news/detail-819351.html

总结一下

Mysql Innodb数据库引擎的在处理事务提交时是通过两段式提交来完成的。通过结合redo.log,bin.log来完成这个两段式提交的动作。但由于各自文件写入磁盘的时机不同,其在实际存储时的顺序也可能不一样。InnoDB通过三个LSN记录数据库恢复时应该从哪个位置开始,并且恢复时先遍历redo.log,只要是commit状态的直接提交,如果是prepare状态的会检查是否提交bin.log,如果有则提交,如果没有,则不提交

 

 

 

 

 

到了这里,关于请你来了解一下Mysql-InnoDB中事务的两段式提交的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mysql进阶-InnoDB引擎事务原理及MVCC

    事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系 统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。  事务的四大特性: 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败

    2024年02月04日
    浏览(26)
  • 什么是Android FrameWork,请你介绍一下?

    Framework是什么 Framework的中文意思是“框架”,在软件开发中通常指开发框架,在一个系统中处于内核层之上,为顶层应用提供接口,被设计用来帮助开发者快速开发顶层应用,而不必关心系统内核运行机制,通常Framework都会隐藏main函数等应用程序必须的组件,开发人员只需

    2024年02月08日
    浏览(43)
  • ⑩⑧【MySQL】InnoDB架构、事务原理、MVCC多版本并发控制

    个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ InnoDB逻辑存储结构 : 🚀 表空间(idb文件) :一个MySQL实例可以对应多个表空间,用于存储记录、索引等数

    2024年02月04日
    浏览(32)
  • MySQL--InnoDB的一次更新事务实现流程与二阶段提交

    InnoDB更新事务流程 涉及内容 一次InnoDB的事务更新操作涉及Buffer Pool,BinLog,RedoLog,UndoLog和物理磁盘。 Buffer Pool: Buffer Pool是InnoDB引入的中间层:内存上的一块连续空间,用来缓存数据页,每个数据页的大小为16KB。它的存在是为了提高SQL的读写性能,避免每次查询和修改都直

    2024年02月02日
    浏览(38)
  • 【MySQL】 深入了解InnoDB存储引擎的限制

    目录 列数限制 索引数限制 InnoDB的行格式和索引限制 示例和注意事项 **页大小对索引键前缀长度的影响 **对全列索引键的限制 多列索引限制 行大小限制 InnoDB log限制 表空间大小限制 表数量限制 操作系统限制 文件大小和日志文件大小 文件层级限制 随着数据库技术的不断发

    2024年01月24日
    浏览(33)
  • 一文带你了解MySQL之InnoDB表空间

    前言 通过前边的内容,相信大家都知道了表空间是一个抽象的概念,对于系统表空间来说,对应着文件系统中 一个或多个 实际文件;对于每个独立表空间来说,对应着文件系统中 一个 名为表名 .ibd 的实际文件。 大家可以把表空间想象成被切分为许多个页的池子,当我们想

    2024年02月08日
    浏览(29)
  • 【面试题】MySQL 事务的四大特性说一下?

    事务是一个或多个 SQL 语句组成的一个执行单元,这些 SQL 语句要么全部执行成功,要么全部不执行,不会出现部分执行的情况。事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。 事务的主要作用是保证数据库操作的一致性,即事务内的

    2024年04月22日
    浏览(21)
  • 面试官:请说一下Mysql事务实现原理

    在日常工作中,数据库是我们必须使用的,其中使用最多的也是大部分中小公司的选择是Mysql,跳槽面试中也是必问的,今天我们就说一下Mysql事务 MySQL中的事务实现原理主要涉及以下几个方面: ACID特性:MySQL支持事务的原因之一是它遵循ACID(原子性、一致性、隔离性和持久

    2024年02月02日
    浏览(29)
  • 一文带你了解MySQL之InnoDB 数据页结构

    前言 学完了记录结构,我们该学数据页的结构,前边我们简单的提了一下页的概念,它是Innodb管理存储空间的基本单位,页的大小默认16KB,InnoDB为了不同的目的而设计了许多种不同类型的页,比如存放表空间头部信息的页,存放Insert Buffer信息的页,存放INODE信息的页,存放

    2024年02月06日
    浏览(78)
  • MySQL系统表information_schema.INNODB_TRX详解及查看当前运行事务

    在日常管理数据库的过程中,有时需要查询MySQL数据库是否正在有正在执行的事务,便于排查业务问题。MySQL的系统库表有数据维护对应的信息,就在 information_schema 库中的 INNODB_TRX 表,包含事务中是否存在锁,事务开启时间,事务执行的语句等等。 SELECT * FROM information_schema

    2024年02月16日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包