数据库第一章 概论简答题
数据库第二章 关系数据库简答题
数据库第三章 SQL简答题
数据库第四第五章 安全性和完整性简答题
数据库第七章 数据库设计简答题
数据库第九章 查询处理和优化简答题
1.什么是数据库中的事务?它有哪些特性?这些特性的含义是什么?恢复技术能保证事务的哪些特性?
事务:
是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是个不可分割的工作单位。
事务的特性:
原子性
A :事务中的操作要么都做,要么都不做;一致性
C :事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态;隔离性
I :一个事务的执行不能被其他事务干扰;持续性
D :一个事务一旦提交,它对数据库中数据的改变就应该是永久性的;
恢复技术可以保证事务的原子性
和持续性
- 保证原子性:UNDO可以保证将未成功提交的操作取消,REDO可以保证将成功提交的操作都完成,因此可以保证事务的原子性;
- 保证持续性:REDO可以保证事务只要提交,改变一定被永久实现;
2.登记日志文件时为什么必须先写日志文件,后写数据库?
- 如果先写数据库,在写日志之前发生了故障,没有登记这个修改,以后就无法恢复这个修改了;
- 如果先写日志文件,在恢复时只是多执行了一次UNDO 操作,并不会影响数据库的正确性。
3.针对不同的故障,给出恢复的策略和方法。
对于事务故障:
反向扫描
文件日志,查找该事务的更新操作;对该事务的更新操作执行逆操作
:即将日志记录中“更新前的值”写人数据库直至读到此事务的开始标记;
对于系统故障:
正向扫描
日志文件找出在故障发生前已经提交的事务队列(REDO队列)和未完成的事务队列(UNDO队列);- 对
未完成
的事务队列中的各个事务进行UNDO
处理; - 对
已经提交
的事务队列中的各个事务进行REDO
处理;
对于介质故障:
- 装人最新的数据库后备副本(离故障发生时刻最近的转储副本),使数据库恢复到最近一次转储时的一致性状态;
- 装人转储结束时刻的日志文件副本;
- 启动系统恢复命令由DBMS完成恢复功能即重做已完成的事务;
4.什么是检查点记录?检查点的内容应该包括哪些?
检查点记录:
是一类新的日志记录
,增加一个重新开始文件,并让恢复子系统在登录日志文件期间动态维护日志。
检查点的内容:
- 建立检查点时刻所有正在执行的事务清单;
- 这些事务的最近一个日志记录的地址;
5.在数据库恢复中使用检查点有什么好处(优点)?试举一个具体例子加以说明
- 节约时间和成本:利用日志技术进行数据库恢复时,恢复子系统必须搜索整个日志,这将耗费大量的时间;
- 避免重复工作:需要 REDO处理的事务实际上已经将它们的更新操作结果写到数据库中了,恢复子系统又会重新执行这些操作,浪费大量时间;
例如:
检查点技术只需从 t c {t_c} tc开始扫描日志,不需要从头开始;
事务 T 3 {T_3} T3的更新实际上已经写到数据库中了,检查点技术在恢复时没有再对其进行REDO处理;
6.试述使用检查点方法进行恢复的步骤。
-
在重新开始文件中找到最后一个检查点记录在日志文件中的地址,由该地址在日志文件中找到最后一个检查点记录;
-
由该检查点记录得到检查点建立时刻所有正在执行的事务清单 ACTIVE-LIST;
建立两个事务队列:- UNDO-LIST:需要执行 UNDO 操作的事务集合;
- REDO-LIST:需要执行 REDO 操作的事务集合;
把 ACTIVE-LIST 暂时放人 UNDO-LIST 队列;REDO 队列暂为空;
-
从检查点开始正向扫描日志文件;
- 如有新开始的事务 T,把 T 暂时放人 UNDO-LIST 队列;
- 如有提交的事务 T,把 T 从 UNDO-LIST 队列移到 REDO-LIST 队列直到日志文件
结束;
-
对 UNDO-LIST 中的每个事务执行 UNDO 操作,对 REDO-LIST 中的每个事务执
行 REDO 操作;
7.什么是数据库镜像?它有什么用途?
数据库镜像:
数据库镜像即根据 DBA 的要求,自动把整个数据库
或者其中的部分关键数据
复制到另一个磁盘
上。
每当主数据库更新时,DBMS 自动把更新后的数据复制过去,即DBMS自动保证
镜像数据与主数据的一致性
。
数据库镜像的用途:
用于数据库恢复
:当出现介质故障时,镜像磁盘可继续使用,同时 DBMS自动利用镜像磁盘数据进行数据库的恢复;提高数据库的可用性
:在没有出现故障时,当一个用户对某个数据加排他锁进行修改时,其他用户可以读镜像数据库上的数据而不必等待该用户释放锁;
8.在数据库中为什么需要并发控制?并发控制技术能保证事务的哪些特性?
- 并发控制的重要性:
数据库中通常会有多个事务在同时进行,可能会产生同时读取或修改同一数据的情况,如果不对并发操作加以控制就可能会导致存取和存储不正确的数据,破坏数据库的一致性,因此需要提供并发控制;
- 并发控制可以保证事务的
一致性
和隔离性
(第一题中:恢复技术可以保证事务的原子性
和持续性
)
9.并发操作可能会产生哪几类数据不一致?用什么方法可以避免各种不一致的情况?
并发可能会产生的不一致性:
丢失修改
:T1和T2同时读和修改同一数据,T2提交的结果会导致T1的修改丢失;不可重复读
:T1读数据后,T2更新同一数据,使T1无法再现前一次的读取结果;读脏数据
:T1修改某一数据后写回磁盘,T2读取同一数据后,T1由于某种原因被撤销,此时数据恢复原值,T2读到的数据就与数据库中的数据不一致;
常用方法:
封锁
、时间戳、乐观控制法和多版本并发控制
10.什么是封锁?基本的封锁类型有几种?试述它们的含义。
封锁:
封锁就是事务T在对某个数据对象例如表、记录等操作之前
,先向系统发出请求,对其加锁
。
加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他的事务不能更新或读取此数据对象
基本的封锁类型:
-
排他锁(X锁)
:若事务T对数据对象A加上锁,则只允许T读取和修改A其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A -
共享锁(S锁)
:若事务T对数据对象A 加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁直到T释放A上的S 锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改
11.什么是活锁?试述活锁产生原因和解决方法。
活锁:
活锁的含义是该等待事务等待时间太长,似乎被锁住了,实际上可能被激活
。如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待。T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求······T2有可能永远等待。
活锁的产生原因:
当一系列封锁不能按照其先后顺序执行
时,就可能导致一些事务无限期等待某个封锁
,从而导致活锁。
活锁的解决方法:
避免活锁的简单方法是采用先来先服务的策略
。当多个事务请求封锁同一数据对象时,封锁子系统按请求封锁的先后次序对事务排队,数据对象上的锁一旦释放就批准申请队列中第一个事务获得锁。
12.什么是死锁?如何预防、检测并解除死锁?
死锁:
如果事务T1封锁了数据R1,T2封锁了数据R2,然后T1又请求封锁R2,因T2已封锁了R2,于是T1等待T2释放R2上的锁。接着T2又申请封锁R1,因,1已封锁了R1,T2也只能等待T1释放R1上的锁。这样就出现了T1在等待T2,而T2又在等待T1的局面,T1和T2两个事务永远不能结束,形成死锁。
预防死锁:
一次封锁法
:要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行顺序封锁法
:预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁
检测死锁:
超时法
:如果一个事务的等待时间超过了规定的时限,就认为发生了死锁;等待图法
:并发控制子系统周期性地生成事务等待图,并进行检测。如果发现图中存在回路,则表示系统中出现了死锁;
解除死锁:
通常采用的方法是选择一个处理死锁代价最小的事务,将其撤销
,释放此事务持有的所有锁,使其他事务得以继续运行下去。
13.在并发控制中,封锁协议是指什么?
封锁协议通常指何时申请X锁或S锁、持锁时间、何时释放等规则,如三级封锁协议:
一级封锁协议
:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放;二级封锁协议
:在一级封锁协议基础上增加事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁;三级封锁协议
:在一级封锁协议的基础上增加事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放;
14.什么是两段锁协议?遵守两段锁协议的事务可能会发生死锁吗?试举例说明。
两段锁协议:
是指所有事务必须分两个阶段对数据项加锁和解锁。
- 在对任何数据进行读、写操作之前,首先要申请并
获得对该数据的封锁
; - 在
释放一个封锁
之后,事务不再申请和获得任何其他封锁;
遵守两段锁协议的事务可能发生死锁
,因为两段锁协议并不要求事务必须一次将所有要使用的数据全部加锁。
15.为什么要引入意向锁?意向锁的含义是什么?
意向锁:
对任一结点加锁时,必须先对它的上层结点加意向锁。引进意向锁后系统对某一数据对象加锁时不必逐个检查与下一级结点的封锁冲突了。
引进意向锁是为了提高封锁子系统的效率
:
在多粒度封锁方法中,一个数据对象可能以两种方式加锁一一显式封锁和隐式封锁,因此系统在对某一数据对象加锁时,不仅要检查该数据对象上有无(显式和隐式)封锁与之冲突,还要检查其所有上级结点和所有下级结点,看申请的封锁是否与这些结点上的(显式和隐式)封锁冲突。显然,这样的检查方法效率很低。