数据库mysql数据库小计

MySQL之二阶段提交

2021-11-13  本文已影响0人  七喜丶

个人理解:

Mysql的二阶段提交和Mysql的事务相辅相成,甚至可以说是辅助事务的存在。为何这样说了?事务是服务于数据库进行update、delete、insert操作时,也就是说只要对于数据库中的数据产生变化就会进行事务管理。而二阶段提交也是基于事务的原理进行数据的管理。两者的目的就是为了使数据库中的数据安全且保存一致性。

二阶段提交

不得不提的二个两个日志:redo logbinlog

为什么会有两份日志呢?因为最开始 MySQL 里并没有 InnoDB 引擎。MySQL 自带的引擎是 MyISAM,但是 MyISAM 没有 crash-safe 的能力,binlog 日志只能用于归档。而 InnoDB 是另一个公司以插件形式引入 MySQL 的,既然只依靠 binlog 是没有 crash-safe 能力的,所以 InnoDB 使用另外一套日志系统——也就是 redo log 来实现 crash-safe 能力

redo log binlog
属于 Innodb Mysql Server
可使用 Innodb引擎特有的 所有引擎都可以使用
日志类型 物理日志 逻辑日志
记录方式 在某个数据页上做了什么操作 给ID=1这一行的C字段加1或减1
写入方式 循环写入 追加写入

binlog
binlog(二进制,归档)日志主要有两个作用:

  1. 主从复制
  2. 数据恢复

redo log
数据在磁盘(数据库)中是按照主键顺序存储的,在对数据进行事务操作的时候,既修改数据又可能对其他数据增删操作,如果每次都写进磁盘是很耗性能

redo log这里就用到的WAS技术,WAL的全称是Write-Ahead Logging,它的关键点是先写日志再写磁盘,并且写日志是顺序写速度很快

理解成当有一条记录需要进行事务的时候,InnoDB 引擎就会先把记录写到redo log,并更新内存,然后需要binlog记录后,才算事务提交成功,同时Innodb引擎会在适当的时候讲这个操作更新到磁盘里面

Innodeb的redo log是固定大小的,比如可以配置为一组4个文件,每个文件的大小是1GB,那么总共可以记录4GB的操作,从头开始写,写到末尾就又会到开始循环。当然当大小不够的时候会讲数据刷新到磁盘(数据文件内)

二阶段提交内部流程

  1. 当进行增删改操作时,执行器会执行此操作的SQL语句,并且开启事务
  2. 执行器会通知存储引擎在内存中查询是否有该数据存在,否则会去查询数据库获取数据
  3. 对数据进行相应的操作,并且更新内存相对的数据信息和在redolog日志中记录操作,其状态为:prepare
  4. 在binlog(归档日志)记录详细的操作后,更新redolog的状态为:commit
  5. 事务提交,结束操作
上一篇下一篇

猜你喜欢

热点阅读