目录
一、引言
对数据库的管理主要通过四个方面实现:
- 恢复
- 并发控制
- 完整性
- 安全性
每一方面构成了DBMS的一个子系统。
二、事务的概念
1 定义
事务(Transaction)的定义:事务是由若干对数据库的操作组成的一个逻辑单位。
宏观上是由程序员写的一条或多条SQL语句的一次执行,微观上是对数据元素的一系列基本操作。
需要提交和撤销。
且事务是数据库系统运行的最小单位。
事务以BEGIN TRANSACTION语句开始,以COMMIT或ROLLBACK语句结束。
假设银行数据库中有一转账事务T,从账号A转50元到账号B,其操作如下:
T: BEGIN TRANSACTION; /*事务开始语句*/
read(A); /*读取A账号中的总钱数*/
A:=A-50;
write(A);
if(A < 0) ROLLBACK; /*如果钱不够,则执行事务回退语句*/
else{
read(B);
B:=B+50;
write(B);
COMMIT; /*事务提交语句*/
}
我们可以看到,ROLLBACK是执行失败的回退,COMMIT是执行成功的提交。
对数据库的访问建立在读和写两个操作的基础上。
读(read):把数据从磁盘中的数据库中读到内存的缓冲区中。
写(write):把数据从内存写回磁盘中。
2 事务的ACID性质
- 原子性(Atomicity):一个事务里面包含的所有操作不可分割,要么全部执行,要么什么都不做。
- 一致性(Consistency):数据库的一致性,即数据不会因为事务的执行而遭到破坏。
- 隔离性(Isolation):在多个事务并发执行时,无论这些事务执行的先后顺序如何,结果都应该是一样的。
- 持久性(Durability):一个事务对数据库的更新应永久地反映在数据库中。事务如果COMMIT,则对于数据库的影响应该是持久的。事务如果ROLLBACK,则不应该对数据库有影响。
三、数据库的故障恢复
1 恢复的定义
数据库的可恢复性:系统能把数据库从被破坏、不正确的状态,恢复到最近一个正确的状态。
由恢复管理子系统来保持事务的原子性和持久性,确保数据不丢失、不破坏。
2 恢复的实现方法
基本原则:冗余,即数据的重复存储
实现冗余的两个方法:转储、建立日志
- 转储
转储即周期性地对整个数据库进行复制,转储到磁盘或磁带中。
- 建立日志
记录事务对数据库的每一次操作。以便有案可查。
日志直接写入介质存储上,会保持正确性。
当事务对数据库进行操作时,先写运行日志,再与数据库缓冲区进行信息交换。(运行记录优先原则)
3 故障类型
3.1 事务故障(对数据库的影响最小)
某个事务自身运行错误所引起的故障。例如存款余额透支、库存量为负、并发事务发生死锁等。
事务故障仅仅影响单个事务。
3.2 系统故障
由于掉电、非正常关机等所引起的故障。
系统故障影响正在运行的所有事务,并且主存内容丢失。
3.3 介质故障(对数据库的影响最大)
由于磁盘遭到损坏而产生的故障。
介质故障既影响内存又影响存储介质。
3.4 三种故障由谁恢复
事务故障和系统故障由系统自动进行。介质故障需要配合DBA来进行。
系统故障称为软故障,介质故障称为硬故障。
4 故障恢复
4.1 事务故障的恢复
事务故障可通过撤消事务来恢复。(事务故障只有UNDO)
重做事务可保证已提交事务的持久性,撤销事务则消除未提交事务的影响。
4.2 系统故障的恢复
检查点:在该时刻,DBMS强制使内存中的内容与介质数据库中的内容保持一致。
即:在检查点之前内存中的数据与介质中的数据是保持一致的。
共分为三种情况:(只用看事务的结束时刻位置,即线条的右末端)
-
在检查点之前结束的事务不需要恢复,因为已经写回DB。如图中的T1
-
在检查点之后,故障点之前结束的事务,需要重做(REDO)。从检查点开始重做。例如T2,T4.
-
在故障点之后结束的事务,需要撤销(UNDO)。例如T3,T5.
检查点方法的恢复算法:①建立重做队列和撤销队列。正向扫描日志文件。找出在故障发生前已经提交的事务进入重做队列;找出在故障发生时还未完成的事务,进入撤销队列。
② 对重做队列中的事务进行REDO处理,对撤销队列中的事务进行UNDO处理。
UNDO的方法:反射扫描日志文件,对该事务的更新操作执行逆操作【插入操作相当于做删除操作等】。直到读到此事务的开始标记。事务故障的恢复就完成了。
REDO的方法:正向扫描日志文件,对每一个重做事务重新操作。
4.3 介质故障的恢复
两个重要时刻:检查点和转储点
使用转储的副本(DB Backup Copies)进行恢复。用副本数据库替换原本的数据库。
由于介质故障影响全面,在用副本恢复后还需要依据运行日志进行恢复。
转储点的确定不能过频,也不能过疏。
四、数据库的并发控制
1 并发操作带来的三个问题
三个问题:
- 丢失更新问题:事务所作的更新操作因另一事务的操作而丢失。
- 不一致分析问题:事务从数据库中读取了处于不一致状态的数据。
- 读脏数据问题:一事务取用了别的事务未提交,然后被ROLLBACK的数据。
1.1 丢失更新问题
例子如图:
(这里每一个事务的操作步骤都是:查找,修改,写回)
1.2 不一致性分析问题(不可重复读)
我们可以看到,事务Ti一共读取了两次数据库中的A和B,在读取的间隙被另一个事务Tj修改了值。因此事务Ti进行了不一致性的分析。