8.5 数据一致性控制
L50
学习目标
事务和检查点机制保证文件数据在系统故障时的一致性。
- 事务:一组不可分割的操作序列,要么全部执行,要么全部不执行(原子性)。
- 事务的ACID特性:原子性、一致性、隔离性、持久性。
- 检查点(Checkpoint):定期将内存中的修改写回磁盘,减少故障后恢复的工作量。
- 数据一致性问题:重复存放的数据在更新时可能不一致,需用事务和并发控制保证。
原理 · 深入理解
8.5 数据一致性控制
本节概览:先建立「数据一致性控制」的框架,再依次展开下列小节。
- 事务
- 检查点
- 并发控制(Concurrent Control)
- 重复数据的数据一致性问题
8.5.1 事务
事务记录(Transaction Record):为实现原子修改,借助事务记录这种数据结构实现。它存放在非常可靠的存储器(又称稳定存储器)中,记录事务运行时数据项修改的全部信息,故又称为运行记录(Log)。
恢复算法:由于被事务 Ti 修改的数据及修改前后的值都能在事务记录表中找到,利用事务记录表,系统能处理任何故障而不使非易失性存储器中信息丢失。恢复算法利用以下两个过程。
- undo〈Ti〉:把所有被事务 Ti 修改过的数据恢复为修改前的值
- redo〈Ti〉:把所有被事务 Ti 修改过的数据设置为新值
8.5.2 检查点
检查点(Check Points)的作用:系统发生故障时,必须检查整个 Log 表,确定哪些事务需要 redo、哪些需要 undo。系统中可能存在许多并发执行的事务,事务记录表中记录会越来越多,故障后清理非常费时。
引入检查点的主要目的:使对事务记录表中事务记录的清理工作经常化,定期把已提交事务的修改写回磁盘并记录检查点。
因为在发生故障后,并不需要对事务记录表中的所有事务记录进行处理,而只需对最后一个检查点之后的事务记录进行处理。因此,恢复例程首先查找事务记录表,确定在最近检查点以前开始执行的最后的事务Ti。在找到这样的事务后,再返回去搜索事务记录表,便可找到第一个检查点记录,恢复例程便从该检查点开始返回搜索各个事务的记录,并利用redo和undo过程对它们进行处理。
8.5.3 并发控制(Concurrent Control)
利用互斥锁实现顺序性:最简单的方法是设置一种用于实现互斥的锁,简称互斥锁(Exclusive Lock)。为每个共享对象设置一把互斥锁。
事务 Ti 访问对象前先获得该对象的互斥锁:成功便锁住对象,Ti 可读或写,其它事务因未获得锁而不能访问。若 Ti 需访问一批对象,为保证原子性,应先获得这批对象的全部互斥锁。
互斥锁简单易行,但效率不高:共享文件虽只允许一个事务写,却允许多个事务同时读,而互斥锁锁住后只允许一个事务读。
为此引入共享锁(Shared Lock):与互斥锁的区别在于——互斥锁仅允许一个事务对相应对象读或写;共享锁允许多个事务同时对相应对象读,但不允许其中任何一个事务写。
8.5.4 重复数据的数据一致性问题
数据一致性控制保证系统中重复存放的数据保持一致,以及在事务、并发操作下数据仍正确。本节讲事务、检查点、并发控制和重复数据一致性。
- 检查点
- 并发控制(Concurrent Control)
结合插图「图8-18 UNIX类型的目录」理解本节要点。
2. 链接数一致性检查在UNIX类型的文件目录中,其每个目录项内都含有一个索引结点号,用于指向该文件的索引结点。对于一个共享文件,其索引结点号会在目录中出现多次。
做 · 交互动画
- 根据「学习目标」列出 3 个关键词,对照原理段落解释给自己听。
数据一致性控制
用控件单步操作;日志区记下每一步发生了什么。
总结与提升
- 能说出一种提高 Flash 寿命的软件策略。
- 能用自己的话复述学习目标,并指出概念与板上实验的对应。
延伸思考
- 断电瞬间写元数据为何危险?
- 如果把本节机制拿到 Linux 或完整 OpenHarmony 上,会多出哪些硬件假设?