mysql日志
mysql事务的隔离性是通过锁来实现的
而原子性,一致性,持久性就是通过日志来实现的。
REDO LOG 称为 重做日志 ,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持
久性。
UNDO LOG 称为 回滚日志 ,回滚行记录到某个特定版本,用来保证事务的原子性、一致性。
REDO日志
为什么存在redo日志?
当我们事务提交了,但是数据还没来得及写到数据库的时候就断电了,写入失败。
这样就违背了事务的持久性原则,那么怎么解决?
1,在事务提交前就将数据写入磁盘,然后再commit。
这样io次数多了,但是起码保证了数据持久性
2,在事务提交的时候,将修改的数据存到日志中,一旦断电了,也可以恢复,这样就不用一直io。
好处:
redo日志降低了刷盘频率
redo日志占用的空间非常小
特点:
redo日志是顺序写入磁盘的
事务执行过程中,redo log不断记录
组成:
重做日志的缓冲 (redo log buffer) ,保存在内存中,是易失的。
重做日志文件 (redo log file) ,保存在硬盘中,是持久的。
redo的整体流程
第1步:先将原始数据从磁盘中读入内存中来,修改数据的内存拷贝
第2步:生成一条重做日志并写入redo log buffer,记录的是数据被修改后的值
第3步:当事务commit时,将redo log buffer中的内容刷新到 redo log file,对 redo log file采用追加
写的方式
第4步:定期将内存中修改的数据刷新到磁盘中
Undo日志
undo log是事务原子性的保证。在事务中 更新数据 的 前置操作 其实是要
先写入一个 undo log
情况一:事务执行过程中可能遇到各种错误,比如 服务器本身的错误 , 操作系统错误 ,甚至是突
然 断电 导致的错误。
情况二:程序员可以在事务执行过程中手动输入 ROLLBACK 语句结束当前事务的执行。
以上情况出现,我们需要把数据改回原先的样子,这个过程称之为 回滚 ,这样就可以造成一个假象:这
个事务看起来什么都没做,所以符合 原子性 要求。
undo log是逻辑日志,对事务回滚时,只是将数据库逻辑地恢复到原来的样子。
redo log是物理日志,记录的是数据页的物理变化,undo log不是redo log的逆过程。