数据库--期末复习(2)

数据库保护

事务:
是一个不可分割的操作序列 ,该操作序列要么全做,要么不做。
不同于程序,一个程序中可以包含多个事务。

分为隐式控制,显式控制:

-- 隐式控制
由DBMS按缺省规定自动化分
-- 显示控制
BEGIN TRANSACTION
[事务开始]
COMMIT
[事务提交,重新改写数据库]
ROLLBACK
[事务提交,发生错误撤销]

事务的特性(ACID):
原子性:事务是不可分割的工作单位。
一致性:事务提交之后,数据库从一个一致性状态到另一个一致性状态。
隔离性:在事务完成之前,它对数据库产生的结果不能被其他事务所引用。
持续性:一旦事务执行成功(提交),其对数据产生的效果永久有效。
破坏ACID特性的因素:
1,多个事务并行运行时,不同事务交叉执行;
2,事务在运行过程中被强行停止。
数据库恢复:
把数据库从错误状态恢复到某一已知的正确状态。
故障类型:
事务故障,介质故障,系统故障,计算机病毒。
事务故障:事物内部故障,不需要重新启动系统;分为预期故障(可以通过在程序中加判断条件来实现)和非预期故障(由于思索而被迫撤销的事务)。
系统故障:需要系统重启,故障类型由硬件错误,突然断电,DBMS代码错误、操作系统故障、,
特点:故障影响正在运行的所有事务,但不破坏数据库。可能会造成数据库中数据的不一致性,原因:故障发生时,尚未完成的事务的结果可能已送到物理数据库;故障发生时,有些已完成的事务所作的数据更改还在缓冲区。
介质故障:存储数据库的磁盘发生故障。
原因:可能是磁盘损坏、磁头碰撞、瞬时强磁场干扰。特点:使数据库受到破坏,可能性小,但是破坏性最大。
计算机病毒:人为故障和破坏,是一些坏程序。
如何建立冗余?
1,通过数据转储建立冗余
转储:定期将数据库数据复制到其他外存保存
静态转储:能保证副本与数据库的一致性,但是效率太低。
动态转储:效率高,但不能保证副本与数据库的一致性。
2,通过日志文件建立冗余
日志文件的记录内容:事务标识(标明哪个事务),操作类型及对象,更新的前后值。
(事务标识,操作类型,对象标识,前像,后像)
日志文件 的作用:
事务故障恢复和系统故障恢复必须使用日志;
在动态转储方式中必须建立日志文件,后备副本和日志文件结合才能有效恢复数据库;
静态转储也可以建立日志文件。
故障恢复:
1,事务故障 的恢复
恢复策略:反向扫描日志文件,将日志中更新前的值的数据写入数据库中,直至事务的开始标志。
2,系统故障的恢复
恢复策略:撤销故障发生时未完成的事务,重做故障发生时已完成的事务。
方法:正向扫描日志文件:找出故障发生前已提交的事务,将该事务放入REDO队列中;找出故障发生前未提交的事务,放入UNDO队列中。
2,对UNDO队列做撤销操作;
3,对REDO队列做重做操作。
介质故障的恢复:
恢复策略:利用数据库副本和日志文件进行恢复。
并发操作引发的问题:
丢失修改、读脏数据、不可重复读
冲突操作
如果两个操作来自于不同的事务,它们对同一数据单位进行操作,并且至少有一个是写操作,则称这两个操作相互冲突。
调度:事务执行次序。
串行调度:如果带调度S中的任意两个事务Ti和Tj,如果Ti的所有操作都先于Tj的所有操作,则称S为串行调度。
并发调度:如果在一个事务中,各个事务交叉执行,则称这个调度是并发调度。
可串行化的调度:
如果一个事务集的并发调度和某一串行调度是等价的,则称该并发带哦都是可串行化的。
封锁技术:是实现并发控制的一种机制,就是在事务对某个数据对象操作之前,先对加锁。
排他锁,X锁,写锁:
若对事务T对数据对象A加上排他锁,则只允许T读取和修改A,不允许其他事务再对A加锁,直到T释放A上的X锁。
共享锁,S锁,读锁:
若事务T对操作对象A加上S锁,则事务T可以读但不能修改A,其他事务只能对A加S锁,而不能加X锁,直到T释放对A的读锁。
封锁协议:
一级:事务T修改数据A之前必须加写锁,直到事务结束才释放X锁。解决–丢失修改问题。
二级:一级封锁协议加上事务T读取数据A之前加上S锁,读完之后即可放S锁。解决丢失修改和读脏数据问题。
三级:一级封锁协议加上事务T读取数据A之前必须加S锁,事务结束才可以放锁。解决丢失数据、读脏数据、不可重复读的问题。
两段锁协议:(2PL协议)某一事务在对数据读、写之前,首先要申请并获得对该数据对象的封锁。在释放一个封锁之后,事务不再申请和获得任何其他锁。
任何一个遵从2PL协议的调度都是可串行化的。
事务遵守2PL协议是可串行化调度的充分条件,而不是必要条件。

————————————————
版权声明:本文为CSDN博主「yellowatumn」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
非常好的有关封锁协议的分析博客文

死锁:事务T1已经封锁A,而又想封锁B;事务T2已经封锁B,,又想申请封锁A,这样,事务TI等着事务T2释放B,而事务T2等着事务T1释放A.
判断并解除死锁的方法:
1,超时法:事务等待超过了规定的期限;
2,等待图法:检测等待图中是否有回路存在
活锁:事务T1,T2申请数据对象A,T1先给A加锁,释放后,事务T3又给A加锁,事务T2等待,这样,A始终被其他事务封锁,事务T2可能长时间得不到A。
避免活锁的办法:采用先来先服务的原则。

数据库设计:

需求分析
是整个设计过程的基础:分为信息需求分析、操作需求分析。信息需求:数据库内容和结构的要求,静态,数据库中需存储的数据;处理需求:数据库进行的数据处理,用户要求的处理功能和对各处理响应时间的要求,动态;安全性和完整性的要求。
1,数据流图(DFD),有四种符号组成:外部项,数据加工,数据存储,数据流。
2,数据字典(DD),是关于数据的数据库,对数据流程图上的各个元素作出详细定义和说明。包含了数据项、数据结构、数据流、数据存储、处理过程。数据项,是不可再分的数据单位。数据结构,反映了数据之间的组合。数据流是数据结构在系统内传输的途径。
数据存储,数据结构停留或保存的地方,也是数据流的来源和去向之一。
概念结构设计: 将需求分析结果用一种形式化的定义和描述,如E-R图。
逻辑结构设计: 概念模型–>数据模型
根据需求分析和概念设计 的结果,选择合适的数据模型,并选用某一设计方法构造数据库模式。
物理结构设计: 选择合适的物理结构,包括存储结构和存取方法。
设计用户外模式:
1,使用更符合用户习惯别名;
2,对于不同级别用户使用不同外模式,以满足系统对安全性的需求。
3,简化用户对系统的使用

关系系统数据库标准语言

**视图:**是从一个或者几个基本表导出的表,它本身不实际存储在数据库中,只存放对视图的定义信息(没有对应数据),因此视图是一个虚表,而基表是一个实关系。
关系数据库的内模式
存储文件和索引一起构成了关系数据库的内模式,其中存储文件是指每一个基本表对应一个存储文件。

-- 外键的定义
create table sc
	(sno char(8) references student(sno),
	cno char(8) references course(cno),
	grade smallint,
	primary key (sno,cno));
-- 或者
create table sc
	(sno char(8),
	cno char(8),
	grade smallint,
	primary key(sno,cno),
	foreign key sno references student(sno),
	foreign key cno references course(cno));
-- 建立索引
create unique index index_name on sc(sno asc,cno desc)
-- 删除索引
drop index index_name on sc;
-- 查询有不及格门次的学生学号
select distinct sno
from sc
where grade<60;
-- 查询年龄在20-22岁之间的学生姓名、年龄和院系
select sname,sage,sdept
from student
where sage between 20 and 22;
-- 查询年龄不在20-22岁之间的学生姓名、年龄和院系
select sname,sage,sdept
from student
where sage not between 20 and 22;
-- 查出计算机学院或是机电学院的学生信息
select * from student
where sdept in ('comput','mechain');
-- 方法二
select * from student
where sdept='comput' or sdept='mechain';
-- 查询所有姓李的学生学号
select * from student
where sname like '李%';
-- 查询DB_Design课程的课程号和学分
select cno,credit
from course
where cname like 'DB/_Design' escape '/';
-- 查询没有成绩的学生学号及课程号
select sno,cno
from sc
where grade is null;
-- 查询学生总人数
select count(*)
from student
-- 查询课程1号的平均成绩
select avg(grade)
from sc
where cno='1';
-- 查询每门课的选课人数
select cno,count(sno)
from sc
group by cno;
-- 查询两门课程以上的学生学号
select sno
from sc
group by sno
having count(cno)>1; 
--查询学号在1-4之间至少选修了两门课程的学生学号及其选修的课程数,并对课程数降序排序.
select  sno,count(cno)
from sc
where sno between 1 and 4
group by sno
having count(cno)>1
order by count(cno) desc;
--查询选修了2号同学选修的课程的学生学号
select distinct a.sno
from sc as a ,sc as b
where b.sno='2'
and a.cno=b.cno;
-- 查询同时选修了1号和2号课程的学生学号
select a.sno
from sc as a,sc as b
where a.cno='1'
and b.cno='2'
a.sno=b.sno;
-- UNION的使用
select sno
from sc
where cno='1'
union
select sno from sc
where cno='2';
-- 查询同时选修了1号和2号课程的学生学号
select sno
from sc
where cno='1'
and sno in 
	(select sno from sc
	where cno='2');
--查询选了1号课程但没选2号课程的同学学号
select sno from sc
where cno='1'
and sno not in 
 	(select sno from sc
 	where cno='2');
 -- 查询每个学生超过他选修课程平均成绩的课程号
 select sno,cno
 from sc as a
 where grade>=
 	(select avg(grade) from sc as b
 	where b.sno=a.sno);
 -- 查询比计算机学院的学生都小的学生姓名和年龄
 select sname,sage from student
 where sage<all
 	(select sage from student
 	where sdept='计算机');
 -- 对每个系,求学生的平均成绩,并存入数据库
 insert into Dept_age(Sdept,Avg_age)
 select sdept,avg(age)
 from student
 group by sdept;
 -- 建立计算机学院的视图
 create view comput
 as
 select * from student
 where sdept='计算机';
 	
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值