MVCC是什么?
MVCC:Multiversion concurrency control(多版本并发控制)
并发访问(读或写)数据库 时,对正在事务内处理的数据做多版本的管理。以达到用来避免写操作的阻塞,从而引发读操作的并发问题。
Mysql中MVCC逻辑流程
插入
删除
修改
查询
案例分析
案例一(代码执行顺序:1,2,3,4,2)
案例二(代码执行顺序:3,4,1,2)
Undo Log
以撤销操作为目的,返回指定某个状态的操作,undo log指事务开始之前,在操作任何数据之前,实现将需要操作的数据备份到一个地方
UndoLog是为了实现事务的原子性而出现的产物:
- 事务处理过程中如果出现了错误或者用户执行了rollback,mysql可以利用undoLog中的备份将数据恢复到事务开始之前的状态。
UndoLog在mysql的InnoDB存储引擎中用来实现多版本并发控制:
- 事务未提交之前,Undo保存了未提交之前的版本数据,undo中的数据可以作为数据旧版本快照,其他并发事务进行快照读
当前读、快照读
- 快照读:sql读取的数据是快照版本,也就是历史版本,普通的select就是快照读,innodb快照读,数据的读取将由cache(原本数据)+undo(事务修改过的数据)两部分组成
- 当前读:sql读取的数据是最新版本。通过锁机制来保证读取的数据无法通过其他事务进行修改;udpate、delete、insert、select......lock in share mode、select ...... for update都是当前读
Redo Log
以恢复操作为目的,重现操作;redolog指事务中操作的任何数据,将最新的数据备份到一个地方;
redolog的持久:不是随着事务的提交才写入的,而是在事务的执行过程中,便开始写入redo中
redolog是为了事务的持久性而出现的产物:防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redolog进行重做,从而达到事务的未入磁盘数据进行持久化这一特性。
RedoLog补充知识
- 指定redolog记录在{datadir}/ib_logfile1&ib_logfile2可通过innodb_log_group_home_dir配置指定目录存储
- 一旦事务成功提交且数据持久化落盘之后,此时redo log 中的对应事务记录就会失去意义,所以redo log的写入时日志文件循环写入的
- 指定redolog日志文件组中的数量innodb_log_files_in_group默认为2
- 指定redolog每一个日志文件最大存储量innodb_log_buffer_size默认16M
- redo buffer持久化redo log的策略,innodb_flush_log_at_trx_commit:
- 0:每秒提交redo buffer --> redolog 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操作