MySQL 事务

MySQL 事务模型

Posted by lijian on September 23, 2019

两个重要的日志

redo log

InnoDB 引擎 特有的日志.位于引擎层,物理日志

当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写redo log里面,并更新内存,这个时候更新就算完成了。同时,InnoDB 引擎会在适当的时候,将这个操作记录更新到磁盘里面

InnoDB 的 redo log 是固定大小的,从头开始写,写到末尾就又回到开头循环写

有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,即 crash-safe 能力.

有个参数标识日志每次都写入磁盘

binlog

位于 Server 层,binlog 日志只能用于归档,追加写,逻辑日志,记录的是一个语句的操作逻辑.

有个参数标识日志每次都写入磁盘

两阶段提交

写入 redo log prepare 状态 , 写入 binlog , 写入 redo log commit 阶段.

redo 是在引擎层的.所以 MySQL 的事务支持实在引擎层实现的.

crash-safe

如果写入了 redo log prepare , 写入 binlog 的时候崩溃,这时候,源库由于没有提交,为更新之前的值,重启通过 binlog 恢复,binlog 没有这一行修改,为更新之前的值,所以数据是一致的.

如果写入了 binlog 但是 写入commit 的时候崩溃了,重启通过binlog 恢复,binlog 有这一行修改,有prepare 状态,会自动 commit