事务过程。
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备份),在事务提交写入到磁盘,从而保证了持久性