事务是一系列数据库操作,是数据库应用撑血的基本逻辑单元。事物处理技术主要包括数据库恢复技术和并发控制技术。数据库恢复机制和并发控制机制是数据库管理系统的重要组成部分。
事务的基本概念
一、事务
所谓事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。
事务的开始与结束可以由用户显式控制。如果用户没有显式地定义事务,则由DBMS按缺省规定自动划分事务。
在SQL中,定义事务的语句有三条:
BEGIN TRANSACTION
COMMIT
ROLLBACK
事务通常是以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。
COMMIT表示提交,即提交事务的所有操作,具体说就是将事务中所有对数据库的更新写回到磁盘,事务正常结束。
ROLLBACK表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销,回滚到事务开始的状态。
二、事务的特征
事务具有原子性、一致性、间隔性和持续性,简称ACID。
1、原子性(Atomicity)
事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做要么全不做。
2、一致性(Consistency)
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
3、隔离性(Isolation)
一个事务的执行不能被其他事务干扰
4、持续性(Durability)
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
保证事务ACID特性是事务管理的重要任务。可能破坏事务特性的因素有:
(1)多个事务并行运行时,不同事务的操作交叉执行;
(2)事务在运行过程中被强行停止;
故障的种类
一、事务内部的故障
事务内部的故障有的是可以通过事务程序本身发现的,有的是非预期的,不能由事务程序处理的。
事务故障意味着事务没有达到预期的重点(COMMIT或显式的ROLLBACK)因此,数据库可能处于不正确状态。恢复郑旭要在不影响其他事务运行的情况下,强行回滚该事务,即撤销该事务已经作出的任何对数据库的修改,使得该事务好像根本没有启动一样。
这类恢复操作称为事务撤销
二、系统故障
系统故障时指造成系统停止运载的任何事件,使得系统要重新启动。
恢复子系统必须在系统重新启动时让所有非正常终止的事务回滚,强行撤销所有未完成的事务。
还需要重做所有已经提交的事务,以将数据库真正恢复到一致的状态。
三、介质故障
系统故障通常称为软故障,介质故障通常称为硬故障,这类故障将破坏数据库或部分数据库,并影响正在存取这部分数据的所有事务。
四、计算机病毒
总结各类故障,对数据库的影响有两种可能性,一是数据库本身被破坏,二是数据库没有被破坏,但数据可能不正确,这是由于事务运行被非正常终止造成的。
恢复的基本原理十分简单:可以用一个词来概括:冗余
恢复的实现技术
恢复机制涉及两个关键问题:一,如何建立冗余数据;二,如何利用这些冗余数据实施数据库恢复。
建立冗余数据最常用的技术是数据转储和登录日志文件。
数据转储
数据转储是数据库恢复中采用的基本技术。所谓转储是DBA定期地将整个数据库复制到磁带或者另一个磁盘上保存起来的过程,这些备用的数据称为后备副本或后援副本。
转储是十分耗费时间和资源的,不能频繁进行。
转储可以分为静态转储和动态转储
静态转储是在系统中无运行事务时进行的转储操作。即转储操作开始的时刻,数据库处于一致性状态,在转储期间不允许(或不存在)对数据库任何存取、修改活动。
动态转储是指转储期间允许对数据库进行存取或修改,即转储和用户事务可以并发执行。
转储还可以分为海量转储和增量转储两种方式:海量转储是一次性转储全部数据库。增量转储则指每次只转储上一次转储后更新过的数据。
登记日志文件
一、日志文件的格式和内容
日志文件时用来记录事务对数据库的更新操作的文件。不同数据库系统采用的日志文件格式并不完全一样。概括起来日志文件主要有两种格式:以记录为单位的日志文件和以数据块为单位的日志文件。
日志文件中需要登记的内容:
各个事务的开始标记
各个事务的结束标记
各个事务的所有更新操作
每个日志记录的内容主要包括
事务标识
操作的类型
更新前数据的旧值
更新后数据的新值
二、日志文件的作用
(1)事务故障恢复和系统故障恢复必须用日志文件
(2)在动态转储方式中必须建立日志文件,后备副本和日志文件结合起来才能有效地恢复数据库
(3)在静态转储方式中,也可以建立日志文件。
三、登记日志文件
为保证数据库是可恢复的,登记日志文件时必须遵循两条原则:
(1)登记的次序严格按并发事务执行的时间次序
(2)必须先写日志文件,后写数据库
“先写日志文件”原则
恢复策略
当系统运行过程中发生故障,利用数据库后备副本和日志文件就可以将数据库恢复到故障之前的某一个一致性状态。
事务故障的恢复
事务故障是指事务在运行至正常终止点之前被终止,这时恢复子系统利用日志文件撤销此事务已对数据库进行的修改。事务故障时由系统自动完成的,对用户是透明的。
事务故障的恢复步骤:
(1)反向扫描日志文件(即从最后向前扫描日志文件),查找该事务的更新操作。
(2)对该事物的更新操作执行逆操作。
(3)继续反向扫描日志文件,查找该事务的其他更新操作,并做同样的处理
(4)如此处理下去,直至读到此事务的开始标记,事务故障恢复就完成了。
系统故障恢复
系统故障的恢复是系统在重新启动时自动完成的,不需要用户干预。
系统故障的恢复步骤:
(1)正向扫描日志文件(即从头扫描日志文件),找出在故障发生前已经提交的事务(这些事务既有BEGIN TRANSACTION 记录,也有COMMIT记录)将其事务标识计入重做队列。
(2)对撤销队列中的各个事务进行撤销处理
(3)对重做队列中的各个事务进行重做处理
介质故障的恢复
1.装入最新的数据库后备副本,使数据库恢复到最近一次转储时的一致性状态。
2.装入相应的日志文件副本,重做已经完成的事务
介质故障的恢复需要DBA介入,但DBA只需要重装最近转储的数据库副本和有关个日志文件副本,然后执行系统提供的恢复命令即可,具体的恢复操作仍由DBMS完成
具有检查点的恢复技术
为了解决恢复系统中浪费时间的问题,在日志文件中增加一类新的记录--检查点记录,增加一个重新开始文件,并让恢复子系统在日志文件期间动态的维护日志。
检查点记录的内容包括:
①建立检查点时刻所有正在执行的事务清单;
②这些事务最近一个日志记录的地址。
动态维护日志文件的方法是,周期性地执行如下操作:建立检查点,保存数据库状态。
①将当前日志缓冲区中的所有日志记录写入磁盘的日志文件上
②在日志文件中写入一个检查点记录
③将当前数据缓冲区的所有数据记录写入磁盘的数据库中
④把检查点记录在日志文件中的地址写入一个重新开始文件。