1、数据库原理与应用教程,第7章 数据库保护7.1 事务的基本概念 (详解) 7.2 并发控制(详解) 7.3 数据库备份与恢复(详解),7.1 事务的基本概念,7.1.1 事务(详解) 7.1.2 事务的特征(详解) 7.1.3 SQL事务处理模型(详解),7.1.1 事务,事务是用户定义的数据操作系列,这些操作作为一个完整的工作单元,一个事务内的所有语句被作为一个整体,要么全部执行,要么全部不执行。,例如:对于一个转帐活动:A帐户转帐给B帐户n元钱,这个活动包含两个动作: 第一个动作:A帐户 n 第二个动作:B帐户 n,7.1.2 事务的特征,原子性(Atomicity) :指事务是数据库的逻
2、辑工作单位,事务中的操作要么都做,要么都不做。 一致性(Consistency) :指事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。 隔离性(Isolation) :指数据库中一个事务的执行不能被其它事务干扰。 持久性(Durability) :也称为永久性指事务一旦提交,则其对数据库中数据的改变就是永久的。,保证事务的ACID特性是事务处理的重要任务。事务的ACID特性可能遭到破坏的因素有: 多个事务并行运行时,不同事务的操作有交叉情况; 事务在运行过程中被强迫停止。,7.1.3 SQL事务处理模型,隐式事务:隐式事务是每一条数据操作语句都自动地成为一个事务。 显式事务:
3、有显式的开始和结束标记的事务。 ISO事务处理模型 T-SQL事务处理模型,ISO事务处理模型,明尾暗头事务的开头是隐含的,事务的结束有明确标记 A事务结束符COMMIT:事务成功结束符, ROLLBACK:事务失败结束符, B事务提交方式自动提交:每条SQL语句为一个事务指定位置提交:在事务结束符或程序正常结束处提交C事务起始/终止位置程序的首条SQL语句或事务结束符后的语句。在程序正常结束处或COMMIT语句处成功终止;在程序出错处或ROLLBACK处失败终止。,示例,UPDATE 支付表 SET 帐户总额 帐户总额 nWHERE 帐户名 A UPDATE 支付表 SET 帐户总额 帐户总
4、额 nWHERE 帐户名 B COMMIT,T-SQL事务处理模型,每个事务都有显式的开始和结束标记。 事务的开始标记是: BEGIN TRANSACTION | TRAN 事务的结束标记为: COMMIT TRANSACTIONTRAN ROLLBACK TRANSACTIONTRAN,示例,例如前边的转帐例子用Transact-SQL事务处理模型描述为: BEGIN TRANSACTION UPDATE 支付表 SET 帐户总额 帐户总额nWHERE 帐户名 A UPDATE 支付表 SET 帐户总额 帐户总额nWHERE 帐户名 B COMMIT,7.2 并发控制,7.2.1 并发控制概
5、述 (详解) 7.2.2 并发控制措施(详解) 7.2.3 封锁协议(详解) 7.2.4 死锁(详解) 7.2.5 并发调度的可串行性(详解) 7.2.6 两段锁协议(详解),7.2.1 并发控制概述,数据库中的数据是一个共享的资源,因此会有很多用户同时使用数据库中的数据, 在多用户系统中,可能同时运行着多个事务,而事务的运行需要时间,并且事务中的操作是在一定的数据上进行的。 当系统中同时有多个事务在运行时,特别是当这些事务是对同一段数据进行操作时,彼此之间就有可能产生相互干扰的情况。,并发事务的相互干扰示例,A、B两个订票点恰巧同时办理同一架航班的飞机订票业务。设其操作过程及顺序如下: A订
6、票点(事务A)读出航班目前的机票余额数,假设为10张; B订票点(事务B)读出航班目前的机票余额数,也为为10张; A订票点订出6张机票,修改机票余额为1064,并将4写回到数据库中; B订票点订出5张机票,修改机票余额为1055,并将5写回到数据库中;,丢失数据修改,读“脏”数据,不可重复读,产生“幽灵”数据,属于不可重复读的范畴。 指当事务T1按一定条件从数据库中读取了某些数据记录后,事务T2删除了其中的部分记录,或者在其中添加了部分记录,则当T1再次按相同条件读取数据时,发现其中莫名其妙地少了(对删除)或多了(对插入)一些记录。 这样的数据对T1来说就是“幽灵”数据或称“幻影”数据。,7
7、.2.2 并发控制措施,控制目标:事务运行过程中尽可能隔离事务外操作对本事务数据环境的影响。 在数据库环境下,并发控制的主要方式是封锁机制,即加锁(Locking),加锁是一种并行控制技术,是用来调整对共享目标,如DB中共享的记录并行存取的技术。,基本的封锁类型,共享锁(S锁):指对于读操作(检索)来说,可以多个事务同时获得共享锁,但阻止其它事务对已获得共享锁的数据进行排它封锁。 排它锁(X锁):一旦一事务获得了对某一数据的排它锁,则任何其它事务再不能对该数据进行排它封锁,其它事务只能进入等待状态,直到第一个事务撤销了对该数据的封锁。,排它锁和共享锁的控制方式,7.2.3 封锁协议,在运用X锁
8、和S锁对数据对象进行加锁时,还需要约定一些规则,如何时申请X锁或S锁、持锁时间、何时释放锁等。称这些规则为封锁协议或加锁协议(Locking Protocel)。 对封锁方式规定不同的规则,就形成了各种不同级别的封锁协议。 不同级别的封锁协议达到的系统一致性级别不同。,一级封锁协议,对事务T要修改的数据加X锁,直到事务结束(包括正常结束和非正常结束)时才释放。 一级封锁协议可以防止丢失修改,并保证事务T是可恢复的 但不能保证可重复读和不读“脏”数据。,一级封锁协议示例,二级封锁协议,一级封锁协议加上对事务T对要读取的数据加S锁,读完后即释放S锁。 除了可以防止丢失修改外,还可以防止读“脏”数据
9、。 但不能保证可重复读数据。,二级封锁协议示例,三级封锁协议,一级封锁协议加上事务T对要读取的数据加S锁,并直到事务结束才释放。 除了可以防止丢失修改和不读“脏”数据之外,还进一步防止了不可重复读。,三级封锁协议示例,不同级别的封锁协议总结,7.2.4 死锁,两个事务相互等待对方先释放资源,则会造成死锁。,预防死锁的方法,一次封锁法 一次封锁法是每个事务一次将所有要使用的数据全部加锁。顺序封锁法 顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按这个顺序封锁。,7.2.5 并发调度的可串行性,多个事务的并发执行是正确的,当且仅当其结果与按某一顺序的串行执行的结果相同,则我们称这种调度为可
10、串行化的调度。 可串行性是并发事务正确性的准则,按这个准则,一个给定的并发调度,当且仅当它是可串行化的时,才认为是正确的调度。,7.2.6 两段锁协议,两段锁协议是实现可串行化调度的充分条件。 可以将每个事务分成两个时期:申请封锁期和释放封锁期,申请期申请要进行的封锁,释放期释放所占有的封锁。 在申请期不允许释放任何锁,在释放期不允许申请任何锁,这就是两段式封锁。,7.3 数据库备份与恢复,7.3.1 数据库故障的种类(详解) 7.3.2 数据库备份 (详解) 7.3.3 数据库恢复 (详解),7.3.1 数据库故障的种类,事务内部的故障 事务故障意味着事务没有达到预期的终点(COMMIT或R
11、OLLBACK),因此,数据库可能处于不正确的状态。 系统故障 指造成系统停止运转、系统要重启的故障。例如,硬件错误(CPU故障)、操作系统故障、突然停电等。 其它故障 介质故障或由计算机病毒引起的故障或破坏。,7.3.2 数据库备份,指定期或不定期地对数据库数据进行复制。 可以复制到本地机器上,也可以复制到其它机器上。 备份的介质可以是磁带也可以是磁盘,但通常选用磁带。 是保证系统安全的一项重要措施。 在制定备份策略时,应考虑如下几个方面: 备份的内容 备份频率,7.3.3 数据库恢复,1恢复策略 事务故障的恢复 系统故障的恢复 介质故障的恢复 2恢复方法 利用备份技术 利用事务日志 利用镜像技术,小结,主要内容 事务的概念 并发控制理论 数据库备份与恢复 基本要求 掌握事务的基本概念和特征 了解显示事务和隐性事务处理模型 了解并发控制的概念 掌握并发控制的各种措施 了解数据库故障的种类 了解数据库备份的概念和策略 了解数据库恢复的概念、策略和方法,重点、难点事务的概念一级、二级、三级封锁协议两段锁协议,