Skip to content

数据一致性控制

目录


参考资料:


在实际应用中,经常会在多个文件中都含有同一个数据。所谓数据一致性问题是指,保存在多个文件中的同一数据,在任何情况下都必需能保证相同。例如,当我们发现某种商品的进价有错时,我们必须同时修改流水账,付费账、分类账及总账等一系列文件中的该商品的价格,方能保证数据的一致性。但如果在修改进行到中途时系统突然发生故障,就会造成各个账目中该数据的不一致性,进而使多个账目不一致。为了保证数据的一致性,在现代 OS 中都配置了能保证数据一致性的软件。

1 事务

1.1 事务的定义

一个事务在对一批数据执行修改操作时,要么全部完成,并用修改后的数据去代替原来的数据,要么一个也不修改。事务操作所具有的这种特性,即事务的原子性(Atomic)。

作为单个程序单元执行的一系列操作,并不是都可以成为事务,也就是说,如果定义其为事务,则必须同时满足四个属性,即事务属性 ACID。除了上述的原子性外,事务还应具备的属性是:

  • 一致性(Consistent),即事务在完成时,必须使所有的数据都保持一致状态
  • 隔离性(Isolated),即对一个事务对数据所作的修改,必须与任何其它与之并发事务相隔离,换言之,一个事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,而不会是任何中间状态的数据
  • 持久性(Durable),即事务完成之后,它对于系统的影响是永久性的。

1.2 事务记录(Transaction Record)

为了实现事务的原子修改,通常须借助于称为事务记录的数据结构来实现。这些数据结构被放在一个非常可靠的存储器中,用来记录在事务运行时数据项修改的全部信息,故又称为运行记录(Log)。该记录中包括有下列字段:

  • 事务名:用于标识该事务的唯一名字。
  • 数据项名:它是被修改数据项的唯一名字。
  • 旧值:修改前数据项的值。
  • 新值:修改后数据项将具有的值。

在事务记录表中的每一记录描述了在事务运行中的重要事务操作,如修改操作、开始事务、托付事务或失败事务等。

1.3 恢复算法

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

  • undo(T):该过程把所有被事务 T 修改过的数据恢复为修改前的值。
  • redo(T):该过程能把所有被事务 T 修过的数据设置为新值。

如果系统发生故障,系统应对以前所发生的事务进行清理。通过查找事务记录表,可以把尚未清理的事务分成两类。

undo 和 redo 日志

一类是其所包含的各类操作都已完成的事务。确定为这一类事务的依据是,在事务记录表中,既包含了 T(开始) 记录,又包含了 T(托付) 记录,此时系统利用 redo(T) 过程把所有已被修改的数据设置成新值。

另一类是其所包含的各个操作并未全部完成的事务。对于事务 T,如果在 Log 表中只有 T(开始) 记录而无 T(托付) 记录,则此 T 便属于这类事务。此时,系统便利用 undo(T) 过程将所有已被修改的数据恢复为修改前的值。

2 检查点

检查点(Check Points)的作用

由于在系统中可能存在着许多并发执行的事务,因而在事务记录表中就会有许多事务执行操作的记录。随着时间的推移,记录的数据也会愈来愈多。因此,一旦系统发生故障,在事务记录表中的记录清理起来就非常费时。

引入检查点的主要目的是,使对事务记录表中事务记录的清理工作经常化,即每隔一定时间便做一次下述工作:

  1. 首先是将驻留在易失性存储器(内存)中的当前事务记录表中的所有记录输出到稳定存储器中
  2. 其次是将驻留在易失性存储器中的所有已修改数据输出到稳定存储器中
  3. 然后是将事务记录表中的检查点记录输出到稳定存储器中
  4. 最后是每当出现一个(检查点)记录时,系统便执行一次恢复操作,即利用 redo 和 undo 过程实现恢复功能。

如果一个事务 T 在检查点前就做了托付(提交),则在事务记录表中便会出现一个在检查点记录前的 T(托付) 记录。在这种情况下,所有被 T 修改过的数据或者是在检查点前已写入稳定存储器,或者是作为检查点记录自身的一部分写入稳定存储器中。因此,以后在系统出现故障时,就不必再执行 redo 操作了。

在引入检查点后,可以大大减少恢复处理的开销。因为在发生故障后,并不需要对事务记录表中的所有事务记录进行处理,而只需对最后一个检查点之后的事务记录进行处理。

因此,恢复例程首先查找事务记录表,确定在最近检查点以前开始执行的最后的事务 T。在找到这样的事务后,再返回去搜索事务记录表,便可找到第一个检查点记录,恢复例程便从该检查点开始返回搜索各个事务的记录,并利用 redo 和 undo 过程对它们进行处理。

3 并发控制

由于事务具有原子性,这使各个事务的执行必然是按某种次序依次进行的,只有在一个事务执行完后,才允许另一事务执行,即各事务对数据项的修改是互斥的。人们把这种特性称为顺序性,而把用于实现事务顺序性的技术称为并发控制。

对同一数据的事务需要互斥

数据库中常用的并发控制技术:互斥锁共享锁

也就是读写锁

4 重复数据的数据一致性问题

为了保证数据的安全性,最常用的做法是把关键文件或数据结构复制多份,分别存储在不同的地方,当主文件(数据结构)失效时,还有备份文件(数据结构)可以使用,不会造成数据丢失,也不会影响系统工作。显然,主文件(数据结构)中的数据应与各备份文件中的对应数据相一致。此外,还有些数据结构(如空闲盘块表)在系统运行过程中总是不断地对它进行修改,因此,同样应保证不同处的同一数据结构中数据的一致性。

集群中最常见的问题

————————————————
版权声明:本文为 田园幻想乡 的原创文章,遵循 CC 4.0 BY-NC-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接: http://truraly.fun/课程笔记/操作系统原理/磁盘存储器的管理/数据一致性控制.html


发布时间:

最后更新时间:

Copyright © 2022 田园幻想乡 浙ICP备2021038778号-1