两阶段提交
在执行一条update语句时候,通过连接器、分析器、优化器之后,调用操作引擎,将新行写入内存,写入redo log,状态为prepare->写binlog->redo log状态修改为commit。写入redo的过程分为了prepare和commit称为二阶段提交
redo和binlog这两种日志有以下三点不同:
- redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
- redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。
- redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。
以 update test set num=num+1 where id=1来描述二阶段提交的过程:
- 执行器调用 Innodb的读接口取出id=1这一行的数据,将num改为num+1,然后在调用Innodb的写接口。
- Innodb写接口被调用后,先把数据写到内存,然后写redo log日志,写完后,将redo log日志置为prepare状态,告诉执行器,自己随时可以提交;
- 执行器写bin log日志,写完后,调用Innodb进行事务提交。
- 可能出现的宕机时机
binlog有记录,redolog状态commit:正常完成的事务,不需要恢复;
binlog有记录,redolog状态prepare:在binlog写完提交事务之前的宕机,恢复操作:提交事务。(因为之前没有提交)
binlog无记录,redolog状态prepare:在binlog写完之前的宕机,恢复操作:回滚事务(因为宕机时并没有成功写入数据库)
学习:
https://blog.csdn.net/m0_73311735/article/details/127935751