1.8 事务管理
通常,对数据库的几个操作合起来形成一个逻辑单元。如1.2节所示的例子是一个资金转账,其中一个系(A系)的账户进行取出操作,而另一个系(B系)的账户进行存入操作。显然,这两个操作必须保证要么都发生要么都不发生。也就是说,资金转账必须完成或根本不发生。
原子性
这种要么完成要么不发生的要求称为原子性( atomicity)
。
一致性
除此以外,资金转账还必须保持数据库的一致性。也就是说,A和B的余额之和应该是保持不变的。这种正确性的要求称作一致性(consistency
)。
持久性
最后,当资金转账成功结束后,即使发生系统故障,账户A和账户B的余额也应该保持转账成功结束后的新值。这种保持的要求称作持久性(durability
)。
什么是事务
事务(transaction
)是数据库应用中完成单一逻辑功能的操作集合
。每一个事务是一个既具原子性又具一致性的单元。因此,我们要求事务不违反任何的数据库一致性约束,也就是说,如果事务启动时数据库是一致的,那么当这个事务成功结束时数据库也应该是一致的。然而,在事务执行过程中,必要时允许暂时的不一致,因为无论是A取出的操作在前还是B存入的操作在前,这两个操作都必然有一个先后次序。这种暂时的不一致虽然是必需的,但在故障发生时,很可能导致问题的产生。
适当地定义各个事务是程序员的职责,事务的定义应使之能保持数据库的一致性。
例如,资金从A系的账户转到B系的账户这个事务可以被定义为由两个单独的程序组成:一个对账户A执行取出操作,另一个对账户B执行存入操作。这两个程序的依次执行可以保持一致性。但是,这两个程序自身都不是把数据库从一个一致的状态转入一个新的一致的状态,因此它们都不是事务。
事务管理器
事务管理器(transaction manager
)包括并发控制管理器
和恢复管理器
。
恢复管理器
原子性和持久性的保证是数据库系统自身的职责,确切地说,是恢复管理器(recovery manager
)的职责。在没有故障发生的情况下,所有事务均成功完成,这时要保证原子性很容易。但是,由于各种各样的故障,事务并不总能成功执行完毕。为了保证原子性,失败的事务必须对数据库状态不产生任何影响。因此,数据库必须被恢复到该失败事务开始执行以前的状态。这种情况下数据库系统必须进行故障恢复( failure recovery)
,即检测系统故障并将数据库恢复到故障发生以前的状态。
并发控制管理器
最后,当多个事务同时对数据库进行更新时,即使每个单独的事务都是正确的,数据的一致性也可能被破坏。并发控制管理器(concurrency-control manager
)控制并发事务间的相互影响,保证数据库致性。
事务已经应用广泛了
事务的概念已经广泛应用在数据库系统和应用当中。虽然最初是在金融应用中使用事务,现在事务已经使用在电信业的实时应用中,以及长时间的活动如产品设计和工作流管理中。
原文链接: 1.8 事务管理