Oracle 和 DB2,比较和兼容性/流程模型
维基教科书关于 架构 的部分涵盖了 Oracle 和 DB2 使用的各种逻辑和物理存储结构。本节介绍了这些 DBMS 如何在这些结构上执行常见的数据库操作。有许多概念是数据库操作的基础,其中最重要的概念是事务的概念。
事务。
事务是 DBMS 中逻辑工作单元。它是数据库对一组数据执行的操作(例如插入、选择、更新和删除)以及数据本身的组合。事务的目的是提供数据库上所有操作之间的隔离 - 事务基本上说“我正在处理这组数据,在我完成之前,我将控制对它的访问”。这也为 DBMS 提供了一种机制来维护数据库的一致性 - 事务中的所有操作要么一起工作,要么一起失败,并且在最后,数据库将处于已知的一致状态。隔离和一致性是定义数据库事务的两个属性。其他属性是原子性和持久性 - 这些概念统称为 ACID。
ACID
所有数据库,无论供应商如何,通常都必须处理大量并发用户和可能包含许多离散步骤的复杂操作 - 每个步骤都可能成功或失败。无论操作是单个步骤还是多个步骤,它都由称为事务的逻辑单元描述。此要求非常普遍,以至于它已被制定为一组属性,通过这些属性可以评估 DBMS(或实际上任何事务系统)。一旦您了解数据库如何实现这些属性,您就可以看到它们如何保证事务可靠性。重要的是要强调,虽然事务需要可靠地处理,但这并不意味着每个 DBMS(即使来自同一供应商的数据库)以完全相同的方式处理这些事务。可靠性意味着,一旦您知道数据库如何处理事务,您就可以确保它始终以这种方式执行。
缩写 ACID 代表原子性、一致性、隔离性和持久性,这些属性用于评估 DBMS 是否可靠地处理事务。它们由 Jim Gray 在 1970 年代定义,1983 年 Andreas Reuter 和 Theo Haerder 创造了缩写 ACID 来描述它们。根据定义,数据库事务必须是 ACID。
原子性。
事务或事务中步骤可能失败的原因有很多。原子性属性指出,事务不能细分,并且无论事务中可能有多少个步骤,它们要么全部工作,要么全部失败。
一致性。
在事务结束时,数据库需要处于一致状态。一个例子是,如果一个字段被定义为整数,则可以通过拒绝十进制数或将它们舍入到整数来维护此字段的一致性 - 两者都将字段保持在一致状态。另一个例子是字段间依赖关系,其中一行中的一个字段依赖于另一行中的一个字段。这称为参照完整性,并且在更改这些字段之一时,有很多选项可以维护数据库的一致性。例如,如果您尝试删除另一个行引用的行,您可以停止事务并将其回滚(原子性)、删除该行以及所有引用它的其他行,或者将引用您要删除的行的一行中的字段设置为预定义的值(即 NULL)。
隔离。
除了最原始的计算机操作之外,所有操作都涉及许多步骤,在多用户系统中,重要的是要确保一个用户对一组数据执行的操作不会被另一个用户在它们下面更改该数据。在这种情况下,我们在我们需要执行的所有步骤周围设置一个逻辑边界,并将其称为事务。隔离是保护此操作中涉及的数据的机制。在最简单的级别,我们可以在事务持续时间内禁止访问此数据。通过诸如死锁(进程 a 拥有进程 b 需要资源,而进程 b 拥有进程 a 需要的数据 - 这就是所谓的致命拥抱),以及简单地锁定数据会降低并发性 - 锁定用户会违背拥有多用户系统的目的。隔离通常是 ACID 属性中最宽松的,并且有很多策略可以处理这个问题。
持久。
数据库不能丢失任何数据,包括事务,这个属性被称为持久性。Oracle 和 DB2 通过将事务写入日志文件并采取特殊措施来确保这些日志文件受到保护(包括将事务同时写入不同磁盘上的不同日志文件,然后将这些日志文件备份到永久离线存储中)来实现持久性。
总结。
数据库绝对不能损坏或丢失数据,上面概述的 ACID 属性是通过锁定、日志记录和事务控制等技术实现的(每个都将在以下部分中介绍)。另一个要求是它们要快。
在您对数据编写任何代码之前,DBMS 已经实现了这些要求中的每一个,并且在许多情况下,即使在来自同一供应商的数据库之间,实现也可能不同。以下部分介绍了 Oracle 和 DB2 的这些操作方面。