</p> (3)立即执行约束和延迟执行约束立即执行约束是指在执行用户事务时,对事务中某一更新语句执行完后马上对此数据所应满足的约束条件进行完整性检查。延迟执行是指在整个事务执行结束后方对此约束条件进行完整性检查,结果正确方能提交。完整性的实现应包括两个方面,一是系统要提供定义完整性约束条件的功能,二是提供检查完整性约束条件的方法。对于数据值的那类完整性约束条件通常在模式中定义。例如在模式中定义属性名、类型、长度、码属性名并标明其值是唯一的、非空的等等。另外的那些约束条件就要用专门的方式加以定义。: N2 k3 G8 Q! f( _$ @
3.并发控制
7 d2 [2 J% d, W8 [ 数据库是一个共享资源,可以由多个用户使用。这些用户程序可以一个一个地串行执行,也可以并行执行。在单CPU计算机上,为了充分利用数据库资源,应该允许多个用户程序并行的存取数据。这样就会产生多个用户程度并发地存取同一数据的情况。若对并发操作不加控制就会存取和存储不正确的数据,破坏数据库的完整性(这里也称为一致性)。在多CPU计算机或多计算机网络环境下,并发控制尤为重要。
3 P: Y) ` l. U, j+ p/ e6 ~ (1)事务的概念 事务(Transaction)是并发控制的基本单位。所谓事务是一个操作序列。这些操作作为一个序列形成一个整体要么都做,要么都不做,是一个不可分割的工作单位。事务通常以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK操作结束。COMMIT即提交,提交事务中所有的操作,事务正常结束。ROLLBACK即撤消已作的所有操作,滚回到事务开始时的状态。这里的操作指对数据库的更新操作。滚回即相当于所有操作均未执行。事务和程序是两个概念。一般地讲,一个程序可包括多个事务,由于事务是并发控制的基本单位,所以下面的讨论均以事务为对象。
0 R) A! |7 ?7 i( w (2)数据一致性级别的概念。所谓并发控制就是要用正确的方式调度并发操作,避免造成数据的不一致性,使一个用户事务的执行不受其它事务的干扰。
; u, d m* Y6 H 4.封锁) |& ]% y& O, Y1 @. ]
封锁(Locking)就是事务T可以向系统发出请求,对某个数据对象(最常用的是记录)加锁。于是事务T对这个数据对象就有一定的控制。例如,其它事务不能更新此数据直到T释放(unlock)它的锁为止。确切的控制由封锁的类型决定。基本的封锁类型有两种:排它锁(Exclu sive locks简记为X锁)和共享锁(Share locks简记为S锁)。若事务T对数据R加上X锁,则只允许T读取和修改R;其它一切事务对R的任何(包括封锁)请求都不成功,直至T释放R上的X锁为止。这就保证了其它事务不能再读取和修改R,直到T释放X锁。若事务T对数据R加上S锁,则其它事务对R的X锁请求不能成功,而对R的共享请求可以得到。这就保证了其它事务以读取R但不能修改R,直至T释放S锁为止。& [7 E0 g7 I3 E' r# d( o
5.可串行性& T: n4 h# e* K7 x2 T8 Z, T
定义 当且仅当某组事务的一定交叉调度产生的结果和这些事务的某一串行调度的结果相同,则这个交叉调度是可串行化的。可串行性(Serializability)是并行事务正确性的准则。这个准则规定,一给定的交叉调度,当且仅当它是可串行化的,才认为是正确的。
' Y9 \ ]4 A* q) x' G: G* e 6.两段锁协议
E3 F9 {* _: w+ F: i 两段锁协议规定所有的事务应遵守下列规则:4 t* E! o0 y# P) i' S1 y8 ]9 `6 Z. P
(1)在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁,而且:# W3 Y# k6 i% m: n8 E5 G
(2)在释放一个封锁之后,事务不再获得任何其它锁。所谓“两段”锁的含义是:事务分为两个阶段。第一阶段是获得封锁,也称为扩展阶段。第二阶段是释放封锁,也称为收缩阶段。定理 若所有事务均遵守两段锁协议,则这些事务的所有交叉调度都是可串行化的(证明略)。为了确保事务并行执行的正确性,许多系统采用两段锁协议。同时系统设有死锁检测机制,发现死锁后按一定的算法解除死锁。
4 l Z$ d, B# {0 }& F! u 7.恢复
: @4 C$ `# T0 Z: P K. |9 S+ T. A 尽管系统中采取了各种保护措施来保证数据库的安全性和完整性不被破坏,保证并行事务的正确执行,但是计算机系统中硬件的故障、软件的错误、操作员的失误以及故意的破坏仍是不可避免的。这些故障轻则造成运行事务非正常地中断,影响数据库中数据的正确性,重则破坏数据库,使数据库中全部或部分数据丢失。因此数据库管理系统必须具有把数扰库从错误状态恢复到某一已知的正确状态(亦称为完整状态或一致状态)的功能,这就是数据库的恢复。恢复子系统是数据库管理系统的一个重要组成部分,而且还相当庞大,常常占整个系统代码的10%以上(如IMS,DB2)。故障恢复是否考虑周到和行之有效,是数据库系统性能的一个重要指标。大型的数据库应用对故障恢复的要求更加强烈。有时甚至采用双工制。' |8 H X8 S$ {7 |
(1)故障的种类数据库系统中可能发生各种各样的故障,大致可以分以下几类:①事务内部的故障;②系统范围内的故障;③介质故障;④计算机病毒。3 q; Q2 g3 t( f7 }" J. u
6 m( R5 U/ H- g (2)转储和恢复转储是数据库恢复中经常采用的基本技术。所谓转储即DBA定期地将整个数据库复制到磁带或另一个磁盘上保存起来的过程。这些备用的数据文本为后备副本或后援副本。当数据库遭到破坏后就可以利用后备副本把数据库恢复。这时,数据库只能恢复到转储时的状态,从那以后的所有更新事务必须重新运行才能恢复到现时的正常状态。转储是十分耗费时间和资源的,不能频繁进行。DBA应该根据数据库使用情况确定一个适当的转储周期。转储可分为静态转储和动态转储。静态转储是指转储期间不允许(或不存在)对数据库进行任何存取、修改活动。动态转储是指转储期间允许对数据库进行存取或修改。即转储和用户事务可以并发执行。静态转储简单,但转储必须等待用户事务结束才能进行。同样,新的事务必须等待转储结束才能执行。显然,这会降低数据库的可用性。动态转储可克服静态转储的缺点。但是,转储结束时后援副本上的数据并不能保证正确有效。例如,在转储期间的某时刻t 1 系统把数据A=100转储到了磁带上,而在时刻t 2 ,某一事务对A进行了修改使A=200转储结束,后援副本上的A已是过时的数据了。为此,必须把转储期间事务对数据库的修改活动登记下来,建立日志文件(log file)。这样,后援副本加上日志文件就能把数据库恢复到某一时刻的正确状态。转储还可以分为海量转储和增量转储。海量转储是指每次转储全部数据库。增量转储则指每次只转储上次转储后更新过的数据。如果数据库很大,事务处理又十分频繁,则增量转储方式是很有效的。(3)日志文件日志文件是用来记录对数据库每一次更新活动的文件。在动态转储方式中必须建立日志文件,后援副本和日志文件综合起来才能有效地恢复数据库。在静态转储方式中,也可以建立日志文件。当数据库毁坏后可重新装放后援副本把数据库恢复到转储结束时刻的正确状态,然后利用日志文件,把已完成的事务进行重做处理,对故障发生时尚未完成的事务进行撤消处理。这样不必重新运行那些在转储前已完成的事务程序就可把数据库恢复到故障前某一时刻的正确状态。 |