您的位置:首页 > 编程语言 > Java开发

Java笔试题---数据库---7月6日

2008-07-06 21:16 288 查看
一. 数据库的三个范式
第一范式:数据库表的每一列都是不可再分割。
第二范式:满足第一范式,且要求数据库表中的每个实例或行必须可以被惟一地区分。
第三范式:满足第二范式,且要求一个数据库表中不包含已在其它表中已包含的非主关
键字信息

二.什么是数据库参照完整性?

参照完整性的定义:如果基本关系R2的属性中,包含与另一个基本关系R1的主码K相对应的属性组F,那么F则称为外部码;对R2每个元组在F上的取值只能只允许两种可能:一是空值;二是等于R1中某个元组的主码值。这里R1和R2不一定是不同的关系;K与F是定义在同一域中的。
举一个实例,教职工关系(职工号,职工名,工资,部门号)和部门关系(部门号,部门名),其中部门关系中的部门号是主码,职工关系中,对每个职工也有部门号这一项,表明这个职工是在哪个部门工作的。职工关系中的部门号属性和部门关系中的部门号属性相对应,职工关系中部门号则是外部码。
从上面的例子可以看到:在职工关系中部门号一项,要么取空值,表示这个职工还未分配到任何一个部门工作;要么取值必须和部门关系中某个元组的部门号相同,表示这个职工分配到某个部门工作。这就是参照完整性。上例中若是教职工关系中某个职工的部门号取值不能与部门关系中任何一个元组的部门号一致,表示这个职工被分配到不属于这个单位的部门工作,这与实际应用环境是不相符的,显然是错误的。这就是为什么关系模型中定义了参照完整性约束规则。
在参照完整性定义中,还注明R1、R2不一定是不同的关系。现再给出一个同一关系的实例:若有教职工关系(职工号,职工名,系主任-职工号,工资),其中职工号是主码。系主任的职工号是外部码,它与本关系职工关系中主码职工号相对应,系主任职工号的取值要么为空值,表示这个系还未任命主任;要么等于职工关系中某个职工号。
实体完整性与参照完整性是由系统自动支持的,即:在建立关系(表)时只要说明了"谁是主码","谁参照于谁",系统将自动进行此类完整性的检查。

三.什么是死锁,有那些方法解决死锁?
死锁: 如果事务T1封锁了数据A,事务T2封锁了数据B。之后T1又申请封锁数据B,因T2已封锁了B,于是T1等待T2释放B上的锁。接着T2又申请封锁A,因T1已封锁了A,T2也只能等待T1释放A上的锁。这样就出现了T1在等待T2,而T2又在等待T1的局面,T1和T2两个事务永远不能结束,形成死锁。如下图所示。



1. 尽可能缩短事务。
2. 尽可能按同一顺序访问数据对象。
3. 避免编写包含用户交互的事务。
4. 使用低隔离级别。
5. 考虑体系结构的优化与代码重构,提高系统整体的运行效率。
6. 通过程序控制事务提交的时机。
7. 将经常更新的数据库和查询数据库分开。定期将不改变的数据导入查询数据库中,这
样查询和更新就可以分开进行,而降低死锁机率。
8. 在进行数据库模式设计时,注意外键引用的完整性,并对外键加索引。如果更新了父
表的主键,由于外键上没有索引,所以子表会被锁定;如果删除了父表中的一行,整
个子表也会被锁定。

死锁的诊断与解除
数据库系统中诊断死锁的方法与操作系统类似,即使用一个事务等待图,它动态地反映所有事务的等待状况。并发控制子系统周期性地(比如每隔1分钟)检测事务等待图,如果发现图中存在回路,则表示系统中出现了死锁。关于诊断死锁的详细讨论请参阅操作系统的有关书籍。
DBMS的并发控制子系统一旦检测到系统中存在死锁,就要设法解除。通常采用的方法是选择一个处理死锁代价最小的事务,将其撤销,释放此事务持有的所有的锁,使其他事务能继续运行下去。

活锁:
如果事务T1封锁了数据对象R后,事务T2也请求封锁R,于是T2等待。接着T3也请求封锁R。T1释放R上的锁后,系统首先批准了T3的请求,T2只得继续等待。接着T4也请求封锁R,T3释放R上的锁后,系统又批准了T4的请求……,T2有可能就这样永远等待下去。这就是活锁的情形,如下图所示。



四.什么是事务,有什么特性?

事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有四个属性,称为原子性、一致性、隔离性和持久性 (ACID) 属性,只有这样才能成为一个事务。

原子性

事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。

一致性

事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。

隔离

由并发事务所作的修改必须与任何其他并发事务所作的修改隔离。事务识别数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是第二个事务修改它之后的状态,事务不会识别中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。

持久性

事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。
本文出自 “唐大老师” 博客,请务必保留此出处http://tscjsj.blog.51cto.com/412451/86107
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: