1
数据库原理与应用技术
1.7.1.2 6.1.2 事务的性质
6.1.2 事务的性质

有限的数据库操作序列构成事务,但并非任何数据库操作序列都能构成事务。事务必须能够保证数据的完整性,这就要求事务具备以下四种特性。

1. 原子性

事务是数据库的逻辑工作单位,它是一个操作序列。这些操作要么都做,要么都不做(Nothing or all原则),是一个不可分割的逻辑工作单位。事务执行的结果必须是使数据库从一种一致性状态转变到另一种一致性状态。因此,当数据库只包含成功事务提交的结果时,数据库一定处于一致性状态。如果因为数据库系统运行中发生故障使事物未能完成,则只能将已执行的部分结果撤销,回滚到事务开始时的一致性状态。如果事务没有原子性的保证,那么在发生系统故障的情况下,数据库就有可能处于不一致性状态。

值得注意的是,即使没有故障发生,系统在某一时刻也会处于不一致性状态。原子性(Atomicity)的要求就是让这种不一致性状态除了在事务执行当中不出现外,在其他任何时刻都是不可见的。保证原子性是DBMS的责任,即事务管理器和恢复管理器的责任。

可见,事务的一致性与原子性是密切相关的。

2. 一致性

所谓一致性(Consistency),简单来说,就是数据库中的数据满足完整性约束,包括它们的正确性。

这里举一个典型的例子——银行中两个账户之间的转账。

例如,某人有两个账户,即A账户和B账户,若他从A账户转移5000元人民币到B账户,则用户在定义事务时应包含两个操作:先从A账户中减去5000元,再往B账户中增加5000元,这两个事务具有要访问相同数据项的联系。这两个操作要么全做要么全不做,如果只执行其中的一个操作,就会使账务出现问题,让此人的利益受到损失。

单个事务的一致性是对该事务进行编码的应用程序员的责任,但是在某些情况下,利用DBMS中完整性约束(如触发器)的自动检查功能有助于一致性的维护。

3. 隔离性

隔离性(Isolation)是指一个事务内部的操作及使用的数据对其他事务是隔离的。

通常情况下,即使每个事务都能保持一致性和原子性,但如果几个事务并发执行,且访问相同的数据项,则其操作会以人们所不希望的某种方式交叉执行,结果导致不一致的状态。数据库系统中的并发控制机制可以保证一个事务的执行不被其他事务干扰,确保事务并发执行后的系统状态与这些事务按某种次序串行执行后的系统状态是等价的,使并发执行的各个事务与事务先后单独执行的结果一致。保证隔离性也是DBMS的责任,即并发控制管理器的责任。

4. 持久性

持久性(Durability)也称为持续性(Permanence),即一旦事务成功执行,在提交之后,数据库的更新永久反映在数据库中,接下来的其他操作或故障不应该对其执行结果有任何影响。保证持久性是DBMS的责任,即恢复管理器的责任。如果数据库中的数据因故遭到破坏,DBMS也应该能够正常恢复。可以用以下两种方式之一来达到持久性的目的。

(1) 以牺牲应用系统的性能为代价:要求事务对数据库系统所做的更新在事务结束前已经写入磁盘。

(2) 以多占用磁盘空间为代价:要求事务已经执行的和已写回磁盘的、对数据库进行更新的信息是充分的(例如,数据库日志的信息足够多),使DBMS在系统出现故障后重新启动系统时,能够(根据日志)重新构造更新。

取每个特性英文名称的第一个字母,即事务的四个特性简称为ACID特性。事务是恢复和并发控制的基本单位,保证事务的ACID特性是DBMS的一项重要任务。