【参考书籍:mysql技术内幕 INNODB存储引擎】【参考了一些博客内容】

事务的隔离性由锁机制来实现,事务的原子性,一致性,持久性通过INNODB的redo log和undo log来完成。

redo log:称为重做日志,用来保证事务的原子性和持久性。

undo log:用来保证事务的一致性。

二者的区别:

undo log:记录某数据修改之前的值,可以用来在事务失败时,进行rollback。undo是逻辑日志,根据每行记录进行记录。

redo log:用于记录某数据被修改之后的值,用来恢复未写入datafile,但是已经成功commit的数据。redo log通常是物理日志,记录的是页的物理修改操作。

redo 日志:

重做日志用来实现事务的持久性,有两部分组成:第一:是内存中的重做日志缓冲,易丢失;第二:重做日志文件,是持久性的。

redo log日志的产生 

为了最大程度避免数据写入时io瓶颈带来的性能问题,MySQL采用了这样一种缓存机制:当query修改数据库内数据时,InnoDB先将该数据从磁盘读取到内存中,修改内存中的数据拷贝,并将该修改行为持久化到磁盘上的事务日志(先写redo log buffer,再定期批量写入),而不是每次都直接将修改过的数据记录到硬盘内,等事务日志持久化完成之后,内存中的脏数据可以慢慢刷回磁盘,称之为Write-Ahead Logging。事务日志采用的是追加写入,顺序io会带来更好的性能优势。

为了避免脏数据刷回磁盘过程中,掉电或系统故障带来的数据丢失问题,InnoDB采用事务日志(redo log)来解决该问题

 

undo log日志产生:

为了满足事务的原子性,在操作任何数据之前,首先将数据备份到Undo Log,然后进行数据的修改。如果出现了错误或者用户执行了ROLLBACK语句,系统可以利用Undo Log中的备份将数据恢复到事务开始之前的状态。与redo log不同的是,磁盘上不存在单独的undo log文件,它存放在数据库内部的一个特殊段(segment)中,这称为undo段(undo segment),undo段位于共享表空间内。

通过一个实例说明undo log与redo log的用法:

 

例如某一事务的事务序号为T1,其对数据X进行修改,设X的原值是5,修改后的值为15,那么Undo日志为<T1, X, 5>,Redo日志为<T1, X, 15>。

 

也有把undo和redo结合起来的做法,叫做Undo/Redo日志,在这个例子中Undo/Redo日志为。

当用户生成一个数据库事务时,undo log buffer会记录被修改的数据的原始值,redo会记录被修改的数据的更新后的值。

redo日志应首先持久化在磁盘上,然后事务的操作结果才写入db buffer,(此时,内存中的数据和data file对应的数据不同,我们认为内存中的数据是脏数据),db buffer再选择合适的时机将数据持久化到data file中。这种顺序可以保证在需要故障恢复时恢复最后的修改操作。先持久化日志的策略叫做Write Ahead Log,即预写日志。

在很多系统中,undo日志并非存到日志文件中,而是存放在数据库内部的一个特殊段中。本文中就把这些存储行为都泛化为undo日志存储到undo log file中。

对于某事务T,在log file的记录中必须开始于事务开始标记(比如“start T”),结束于事务结束标记(比如“end T”、”commit T”)。在系统恢复时,如果在log file中某个事务没有事务结束标记,那么需要对这个事务进行undo操作,如果有事务结束标记,则redo。

在db buffer中的内容写入磁盘数据库文件之前,应当把log buffer的内容写入磁盘日志文件。

有一个问题,redo log buffer和undo log buffer存储的事务数量是多少,是按照什么规则将日志写入log file?如果存储的事务数量都是1个,也就意味着是将日志立即刷入磁盘,那么数据的一致性很好保证。在执行事T时,突然断电,如果未对磁盘上的redo log file发生追加操作,可以把这个事务T看做未成功。如果redo log file被修改,则认为事务是成功了,重启数据库使用redo log恢复数据到db buffer和 data file即可。

如果存储多个的话,其实也挺好解释的。就是db buffer写入data file之前,先把日志写入log file。这种方式可以减少磁盘IO,增加吞吐量。不过,这种方式适用于一致性要求不高的场合。因为如果出现断电等系统故障,log buffer、db buffer中的完成的事务会丢失。以转账为例,如果用户的转账事务在这种情况下丢失了,这意味着在系统恢复后用户需要重新转账。

 

 

幂等性:

在日志文件中的操作记录应该具有幂等性。幂等性,就是说同一个操作执行多次和执行一次,结果是一样的。例如,5*1 = 5*1*1*1,所以对5的乘1操作具有幂等性。日志文件在故障恢复中,可能会回放多次(比如第一次回放到一半时系统断电了,不得不再重新回放),如果操作记录不满足幂等性,会造成数据错误。

【本篇博文参考多遍博文】

https://blog.csdn.net/kobejayandy/article/details/50885693

https://blog.csdn.net/chenlvzhou/article/details/40537839

等等

 

©著作权归作者所有:来自51CTO博客作者Jack_jason的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. Android(安卓)Studio 修改 Logcat 颜色
  2. 理解Android中垃圾回收日志信息
  3. Android(安卓)sd卡log日志
  4. anr日志
  5. android单元测试用例和日志输出
  6. android学习日志六
  7. Android上的log,日志相关
  8. Android保存日志记录到sd卡的文件中
  9. Android(安卓)logcat详细用法

随机推荐

  1. android对html支持接口总结
  2. android wifi连接
  3. Android中的内存管理
  4. Android播放GIF动画
  5. 分享自己在项目中对android文件系统的一
  6. Android Instrumentation Testing
  7. Android上的C/C++调用Java问题(转载)
  8. Android应用开发(一):Android平台搭建与开发
  9. android:process的坑,你懂吗?
  10. android mediareorder 使用实践总结