本文参考mysql在RR的隔离级别下,究竟是通过MVCC解决幻读的还是通过行锁的next key算法解决的?,MySQL日志系统
背景
我们在Mysql第三篇讲解过数据的事务以及数据库的隔离级别,当时只提到ACID中的ACD是通过日志实现的,I中的读已提交以及可重复读是通过MVCC来实现的,那么这一篇文章就学习一下。
日志
-
redo日志:实现原子性和持久性
redo日志是InnoDB存储引擎层的日志,用于记录事务操作,,如果数据库此时断电或者发生其他情况,可以先根据redo日志恢复到之前的一个状态,并切未完成的事务可以根据恢复策略对未完成的事务选择继续执行还是回滚。并且这里涉及到Mysql一个很重要的概念就是日志先行,即任何日志执行前都会先写日志,日志记录完成后才进行最终的事务执行。 -
undo日志:实现一致性
undo日志保存了某个已完成部分未全部完成事务前的数据情况,可以为事务提供回滚操作。undo log不是redo log的逆向过程,redo log是物理日志,记录的是数据页的物理修改,可以用来恢复所有数据。undo用来回滚行记录到某个版本。undo log一般是逻辑日志,根据每行记录进行回滚。 -
bin日志
binlog是Server层的日志,属于逻辑日志,是以二进制的形式记录的是这个语句的原始逻辑,binlog是追加写日志,一份写到一定大小的时候会更换,不会覆盖。而redo日志是循环写,日志空间大小固定。
MVCC
MVCC也叫做多版本控制,是通过数据库快照来实现。InnoDB 的 MVCC,是通过在每行记录后面保存两个隐藏的列来实现。一个是行的创建时期系统版本号,一个是行的删除时间系统版本号。系统版本号根据事务开始而自增。所以当我在两个事务分别进行操作时可以根据这个系统版本号或者叫快照来进行安全查看。
网友评论