事务是一些列的数据库操作,是数据库应用程序的基本逻辑单位。事务处理技术主要包括并发控制技术和数据库恢复技术。并发控制和数据库恢复机制是数据库管理系统的重要组成部分,并发控制机制用来控制多个事务的并行运行,避免它们之间的互相干扰,保证每个事务都产生正确的结果。数据库恢复机制用来进行系统失败后的恢复处理,确保数据库能够恢复到正确状态。
1. 单用户数据库系统和多用户数据库系统
数据库一般可以氛围单用户和多用户系统两种。在任何一个时刻只允许一个用户使用的数据库系统是单用户数据库系统。允许多个用户同时使用的数据库系统是多用户数据库系统。单用户数据库系统一般我们普通的计算机系统。大多数数据库系统都是多用户系统。就像火车票数据库系统、银行数据库系统。这样的系统中,同时并发运行的事务可能有几万个或者几十万个。
多用户数据库系统的思想来自于并发程序设计。并发程序设计允许多个程序在一个计算机系统中同时运行。在具有单个处理机的系统中,程序的并发运行实际上是多个程序的轮流交叉运行,也就是我们常说的时间片轮转。在同一时刻,只有一个程序运行。当运行的程序需要等待某些信息或等待输入输出处理时,这个程序被挂起,其他可运行程序启动运行。当一个挂起的程序的等待信息到来或者等待的事件发生之后,如果处理机有空闲时间,这个程序从间断处恢复执行。虽然单处理机系统中的并行程序并没有被真正的并行运行,但是减少了处理机的空闲时间,提高了系统的效率。在多处理机系统中,每个处理机可以处理一个程序,多个处理机可以同时运行。在这样的系统中,我们可以实习多个程序的真正的并行运行。数据库系统的并发控制是以单处理机系统为基础的。所以我们以下就一单处理机系统为主。
在一个多用户数据库系统中,数据库中存储的数据项是用户程序存取的基本信息资源。一个存取或改变数据库内容的程序成为一盒数据库事务,简称事务。多个事务可以同时运行并且可以同时存取或者修改同一个数据库记录。如果不对并发运行的事务加以控制,会引起很多问题。
2. 并发控制的必要性
我们使用火车票数据库系统来说明。假设在这个系统中,每个车次一个数据库记录。每个记录包括对应车次已经预定的座位数和一些其他的信息。设X和Y分别是车次K1和K2对应的数据库记录。
下面的事务T1取消车次K1上已经预定的N个座位,并为车次K2增加N个预定座位。
READ(X);
X = X - N;
WRTIE(X);
READ(Y);
Y = Y + N;
WRITE(Y)。
下面的事务T2为车次K1增加M个座位。
READ(X);
X = X + M;
WRITE(X)。
现在我们来看看,不对T1和T2的并发运行加以控制将会出现什么问题。
1. 数据更新丢失的问题
设T1和T2差不多同时交付系统运行,而且T1和T2按下图的方式并发运行。T1和T2运行结束以后,X的值是不正确的,因为T2在T1完成对X的修改之前读X,丢失了T1对X的修改。假设T1和T2开始运行之前,X=60,N=5,M=6,X的最后结果应该是61,但是按下图的运行结果是66。
2. 临时值问题
设T1和T2按下图的方式并发执行,T1在读Y时失败。这时系统必须把X恢复到原来的值,T1对X的影响被取消。可是,T2已经读取了由T1修改过的X的临时值,并使用这个不确定的值对X进行了修改。于是在下图中,T1和T2的运行结果是不正确的。我们把由T1修改过的X值叫临时值,因为他还没有被永久性的存储在数据库中。由下图这种并发运行方式所引起的问题叫临时值问题。
3. 错误聚集计算问题
聚集计算函数经常在事务中出现,如求和函数。例如,如果两个事务并发运行,第一个事务计算数据库的所有记录的某个数据域的和,而第二个事务在更新这个数据域,那么第一个事务的计算结果可能处错。下图是个例子,当事务T3计算所有车次已经预定出得座位数的和时,事务T1更新相应的数据域。由于T3在X-N中后在读X,在Y+N之前读了Y,所以T3的计算结果比正确结果少N。
那我们该怎样对事务的并发进行控制呢?先让我们深入的了解下事务模型,下一节讲事务模型。