MySQL之二阶段提交
个人理解:
Mysql的二阶段提交和Mysql的事务相辅相成,甚至可以说是辅助事务的存在。为何这样说了?事务是服务于数据库进行update、delete、insert操作时,也就是说只要对于数据库中的数据产生变化就会进行事务管理。而二阶段提交也是基于事务的原理进行数据的管理。两者的目的就是为了使数据库中的数据安全且保存一致性。
二阶段提交
不得不提的二个两个日志:redo log
和binlog
为什么会有两份日志呢?因为最开始 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(二进制,归档)日志主要有两个作用:
- 主从复制
- 数据恢复
redo log
数据在磁盘(数据库)中是按照主键顺序存储的,在对数据进行事务操作的时候,既修改数据又可能对其他数据增删操作,如果每次都写进磁盘是很耗性能
redo log这里就用到的WAS技术,WAL的全称是Write-Ahead Logging,它的关键点是先写日志再写磁盘,并且写日志是顺序写速度很快
理解成当有一条记录需要进行事务的时候,InnoDB 引擎就会先把记录写到redo log,并更新内存,然后需要binlog记录后,才算事务提交成功,同时Innodb引擎会在适当的时候讲这个操作更新到磁盘里面
Innodeb的redo log是固定大小的,比如可以配置为一组4个文件,每个文件的大小是1GB,那么总共可以记录4GB的操作,从头开始写,写到末尾就又会到开始循环。当然当大小不够的时候会讲数据刷新到磁盘(数据文件内)
二阶段提交内部流程
- 当进行增删改操作时,执行器会执行此操作的SQL语句,并且开启事务
- 执行器会通知存储引擎在内存中查询是否有该数据存在,否则会去查询数据库获取数据
- 对数据进行相应的操作,并且更新内存相对的数据信息和在redolog日志中记录操作,其状态为:prepare
- 在binlog(归档日志)记录详细的操作后,更新redolog的状态为:commit
- 事务提交,结束操作