undo

事务过程。

 

MySQL数据库InnoDB存储引擎Log漫游

1 – Undo Log

Undo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版本并发控制(简称:MVCC)。

  • 事务的原子性(Atomicity) 事务中的所有操作,要么全部完成,要么不做任何操作,不能只做部分操作。如果在执行的过程中发生 了错误,要回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过。

  • 原理 Undo Log的原理很简单,为了满足事务的原子性,在操作任何数据之前,首先将数据备份到一个地方 (这个存储数据备份的地方称为Undo Log)。然后进行数据的修改。如果出现了错误或者用户执行了 ROLLBACK语句,系统可以利用Undo Log中的备份将数据恢复到事务开始之前的状态。

除了可以保证事务的原子性, Undo Log也可以用来辅助完成事务的持久化

  • 事务的持久性(Durability) 事务一旦完成,该事务对数据库所做的所有修改都会持久的保存到数据库中。为了保证持久性,数据库 系统会将修改后的数据完全的记录到持久的存储上。

  • 用Undo Log实现原子性和持久化的事务的简化过程 假设有A、B两个数据记录,值分别为1,2。

  • 1).事务开始:begin或start transaction

  • 2).记录A=1到undo log

  • 3).修改A=3

  • 4).记录B=2到undo log

  • 5).修改B=4

  • 6).将undo log写到磁盘

  • 7).将数据写到磁盘

  • 8).事务提交

  • 这里有一个隐含的前提条件:‘数据都是先读到内存中,然后修改内存中的数据,最后将数据写回磁盘’。

    之所以能同时保证原子性和持久化,是因为以下特点:

  • A. 更新数据前记录Undo log。

  • B. 为了保证持久性,必须将数据在事务提交前写到磁盘。只要事务成功提交,数据必然已经持久化。

  • C. Undo log必须先于数据持久化到磁盘。如果在7)、8)之间系统崩溃,undo log是完整的, 可以用来回滚事务。

  • D. 如果在1)、7)之间系统崩溃,因为数据没有持久化到磁盘。所以磁盘上的数据还是保持在事务开始前的状态。

缺陷:每个事务提交前将数据和Undo Log写入磁盘,这样会导致大量的磁盘IO,因此性能很低。

如果能够将数据缓存一段时间,就能减少IO提高性能。但是这样就会丧失事务的持久性。因此引入了另外一 种机制来实现持久化,即Redo Log.

2 – Redo Log

  • 原理 和Undo Log相反, Redo Log记录的是新数据的备份。在事务提交前,只要将Redo Log持久化即可, 不需要将数据持久化。当系统崩溃时,虽然数据没有持久化,但是Redo Log已经持久化。系统可以根据 Redo Log的内容,将所有数据恢复到最新的状态。

  • Undo + Redo事务的简化过程 假设有A、B两个数据,值分别为1,2.

  • 1).事务开始

     
  • 2).记录A=1到undo log

  • 3).修改A=3

  • 4).记录A=3到redo log

 

  • 5).记录B=2到undo log

  • 6).修改B=4

  • 7).记录B=4到redo log

 

  • 8).将redo log写入磁盘

 

  • 9).事务提交

############################################

-->>开始事务

-->>n个( undo内存-->>修改内存-->>redo内存) 

-->>redo落盘

-->>提交事务。

###########################################

undo log 保存的是修改前的数据,并且保存到内存中,回滚的时候在读取里面的内容(从而实现了原子性),redolog保存的是修改后的数据(对新数据的备份,同时也会将redo log备份),在事务提交写入到磁盘,从而保证了持久性

上一篇:Mysql中的MVCC


下一篇:111111