MySQL MVCC Undo log Redo log

目录

什么是MVCC?

MVCC-插入 

MVCC-删除

MVCC-修改

MVCC-查询

Undo log

Redo log

什么是MVCC?
Multi Version Concurrency Control (多版本并发控制)

并发访问(读或写)数据库时,对事务内正在处理的数据做多版本管理。以实现写操作堵塞的同时,依然可以进行读操作。

MVCC-插入 
插入规则:在数据行版本号列保存当前事务ID。

MVCC-删除
删除规则:将删除版本号列更新为当前事务ID。

MVCC-修改
修改规则:现将命中的数据行copy,将原数据的删除版本号设置为当前事务ID(33)。

 

MVCC-查询
查询规则:

1. 查找数据行版本小于或等于当前事务版本的数据行。这样可以确保事务读取的行,要么是在事务开始之前就存在的,要么是事务自身插入或修改过的;

2. 查找删除版本号要么为NULL,要么大于当前事务版本号的数据行。这样可以确保查询出来的记录在事务开启前没有被删除。

Undo log
Undo意为取消,以撤销操作为目的,返回指定某个状态的操作。

Undo log指事务开始之前,在操作任何数据之前,首先将需操作的数据备份到一个地方 (Undo Log)。

UndoLog是为了实现事务的原子性而出现的产物。

Undo Log实现了事务的原子性:

事务处理过程中如果出现了错误或者用户执行了 ROLLBACK语句,MySQL可以利用Undo Log中的备份将数据恢复到事务开始之前的状态。

MySQL InnoDB通过Undo log实现MVCC:

事务未提交之前,Undo log保存了未提交之前的版本数据,Undo log中的数据可作为数据旧版本快照供其他并发事务进行快照读。 

快照读:

SQL读取的数据是快照版本,也就是历史版本,普通的SELECT就是快照读。

当前读:

SQL读取的数据是最新版本。通过锁机制来保证读取的数据无法通过其他事务进行修改。

UPDATE、DELETE、INSERT、SELECT … LOCK IN SHARE MODE、SELECT … FOR UPDATE都是当前读。

Redo log
Redo意为重做。以恢复操作为目的,重现操作。

Redo log指事务中操作的任何数据,将最新的数据备份到一个地方 (Redo Log)。

Redo log一般是在事务提交的时候以顺序IO的方式写入磁盘。具体的落盘策略可以进行配置。

Redo log实现了事务的持久性:

防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据Redo log进行重做,从而保证事务中尚未写入磁盘的数据的持久性。

一旦事务成功提交且数据持久化落盘之后,此时Redo log中的对应事务数据记录就失去了意义,所以Redo log的写入是日志文件循环写入的。

指定Redo log日志文件组中的数量 innodb_log_files_in_group 默认为2;

指定Redo log每一个日志文件最大存储量innodb_log_file_size 默认48M;

指定Redo log在cache/buffer中的buffer池大小innodb_log_buffer_size 默认16M。

Redo buffer 持久化Redo log的策略, Innodb_flush_log_at_trx_commit:

取值 0 每秒提交 Redo buffer --> Redo log OS cache -->flush cache to disk[可能丢失一秒内的事务数据];

取值 1 默认值,每次事务提交执行Redo buffer --> Redo log OS cache -->flush cache to disk[最安全,性能最差的方式];

取值 2 每次事务提交执行Redo buffer --> Redo log OS cache 再每一秒执行 -->flush cache to disk操作 。

你可能感兴趣的:(mysql)