8.5 数据一致性控制

L50

学习目标

事务和检查点机制保证文件数据在系统故障时的一致性。

  • 事务:一组不可分割的操作序列,要么全部执行,要么全部不执行(原子性)。
  • 事务的ACID特性:原子性、一致性、隔离性、持久性。
  • 检查点(Checkpoint):定期将内存中的修改写回磁盘,减少故障后恢复的工作量。
  • 数据一致性问题:重复存放的数据在更新时可能不一致,需用事务和并发控制保证。

原理 · 深入理解

8.5 数据一致性控制

本节概览:先建立「数据一致性控制」的框架,再依次展开下列小节。

  1. 事务
  2. 检查点
  3. 并发控制(Concurrent Control)
  4. 重复数据的数据一致性问题

8.5.1 事务

事务记录(Transaction Record):为实现原子修改,借助事务记录这种数据结构实现。它存放在非常可靠的存储器(又称稳定存储器)中,记录事务运行时数据项修改的全部信息,故又称为运行记录(Log)。

恢复算法:由于被事务 Ti 修改的数据及修改前后的值都能在事务记录表中找到,利用事务记录表,系统能处理任何故障而不使非易失性存储器中信息丢失。恢复算法利用以下两个过程。

  1. undo〈Ti〉:把所有被事务 Ti 修改过的数据恢复为修改前的值
  2. 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 重复数据的数据一致性问题

数据一致性控制保证系统中重复存放的数据保持一致,以及在事务、并发操作下数据仍正确。本节讲事务、检查点、并发控制和重复数据一致性。

  1. 检查点
  2. 并发控制(Concurrent Control)
图8-18 UNIX 类型的目录 普通 UNIX 目录 name   i-node a.c    12 b.c    27 带重复文件的目录 name  i-node₁ i-node₂ a.c   12   45 同一文件名对应多份副本 查一致性时要让各副本的索引结点内容对得上。
图8-18

结合插图「图8-18 UNIX类型的目录」理解本节要点。

图8-18 UNIX 类型的目录 普通 UNIX 目录 name   i-node a.c    12 b.c    27 带重复文件的目录 name  i-node₁ i-node₂ a.c   12   45 同一文件名对应多份副本 查一致性时要让各副本的索引结点内容对得上。
图8-18 UNIX类型的目录

2. 链接数一致性检查在UNIX类型的文件目录中,其每个目录项内都含有一个索引结点号,用于指向该文件的索引结点。对于一个共享文件,其索引结点号会在目录中出现多次。

做 · 交互动画

  • 根据「学习目标」列出 3 个关键词,对照原理段落解释给自己听。

数据一致性控制

用控件单步操作;日志区记下每一步发生了什么。

总结与提升

  • 能说出一种提高 Flash 寿命的软件策略。
  • 能用自己的话复述学习目标,并指出概念与板上实验的对应。

延伸思考

  • 断电瞬间写元数据为何危险?
  • 如果把本节机制拿到 Linux 或完整 OpenHarmony 上,会多出哪些硬件假设?

← 本阶段封面 · 课程列表