赞
踩
目录
Multi Version Concurrency Control (多版本并发控制)
并发访问(读或写)数据库时,对事务内正在处理的数据做多版本管理。以实现写操作堵塞的同时,依然可以进行读操作。
插入规则:在数据行版本号列保存当前事务ID。
删除规则:将删除版本号列更新为当前事务ID。
修改规则:现将命中的数据行copy,将原数据的删除版本号设置为当前事务ID(33)。
查询规则:
1. 查找数据行版本小于或等于当前事务版本的数据行。这样可以确保事务读取的行,要么是在事务开始之前就存在的,要么是事务自身插入或修改过的;
2. 查找删除版本号要么为NULL,要么大于当前事务版本号的数据行。这样可以确保查询出来的记录在事务开启前没有被删除。
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意为重做。以恢复操作为目的,重现操作。
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操作 。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。