数据库原理(三)

数据库原理(三)

数据库性能的瓶颈很大程度在于I/O瓶颈。

数据库索引

一个索引是存储的表中一个特定列的值数据结构。索引是在表的列上创建。
所以,要记住的关键点是索引包含一个表中列的值,并且这些值存储在一个数据结构中。索引是一种数据结构 。

事务

数据库事务是构成单一逻辑工作单元的操作集合

事务的ACID特性

原子性(Atomicity):事务中的所有操作作为一个整体像原子一样不可分割,要么全部成功,要么全部失败。

一致性(Consistency)
事务的执行结果必须使数据库从一个一致性状态到另一个一致性状态。
一致性状态是指:
1.系统的状态满足数据的完整性约束(主码,参照完整性,check约束等)
2.系统的状态反应数据库本应描述的现实世界的真实状态,比如转账前后两个账户的金额总和应该保持不变。

隔离性(Isolation)
并发执行的事务不会相互影响,其对数据库的影响和它们串行执行时一样。
比如多个用户同时往一个账户转账,最后账户的结果应该和他们按先后次序转账的结果一样。

持久性(Durability)
事务一旦提交,其对数据库的更新就是持久的。
任何事务或系统故障都不会导致数据丢失。

可串行化

当且仅当其结果与按某一次序串行地执行它们时的结果相同,
我们称这种调度策略为可串行化(Serializable)调度。这样的结果是正确的。

冲突可串行化

在多用户DBS中,如果多个用户同时对同一数据进行操作称为并发操作。
并发操作使多个事务之间可能产生相互干扰,破坏事务的隔离性(Isolation)。
DBMS的并发控制子系统负责协调并发事务的执行,保证数据库的一致性,避免产生不正确的数据。
所以就产生了锁。

封锁的基本类型

X锁,写锁,排它锁
若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁

S锁,读锁,共享锁
若事务T对数据对象A加上S锁,则其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S

U锁
当s发出一个更新请求之后,数据库会对表中的每条记录加上U锁。然后数据库会根据条件,将符合条件的记录转换为X锁。对不满足条件的记录释放U锁。

死锁和活锁

死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

什么是活锁
数据资源释放时间不确定,导致某些事务长时间等待,得不到封锁的机会。
如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待。T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求,...,T2有可能永远等待,这就是活锁的情形

如如何处理死锁

检测死锁时间
超时设置,就是设置时间,如果超过时间则不执行。

等待图
等待图是一个有向图G=(T,U)。 T为结点的集合,每个结点表示正运行的事务;U为边的集合,每条边表示事务等待的情况。
若T1等待T2,则T1、T2之间划一条有向边,从T1指向T2。事
务等待图动态地反映了所有事务的等待情况。并发控制子系统周期性地(比如每隔1分钟)检测事务等待图,如果发现图中存在回路,则表示系统中出现了死锁。

获取所有资源,程序运行时获取所有的资源。

按照顺序来执行,把程序按先后顺序来执行。

事务重试(transaction retry)
每个事务都有时间戳,当t1申请锁,但是被t2占用了。这是有两个选择。
第一个:t1和t2比较时间,如果t2的时间大于t1则等待,否则t1就回滚。然后重新运行(还是按原先的时间戳运行)。
第二个:和第一个相反。

数据库安全

1.视图,通过视图保护数据库.
2.授权.通过授权保证安全.
3.数据的加密和解密.

触发器

触发器(TRIGGER)是由事件来触发某个操作。
这些事件包括INSERT语句、UPDATE语句和DELETE语句。
当数据库系统执行这些事件时,会激活促发其执行相应的操作。

语法

创建只有一个执行语句的触发器



创建有多个执行语句的触发器

数据库范式

第一范式
1NF是对属性的原子性,要求属性具有原子性,不可再分解
如学生(学号,姓名,性别,出生年月日),如果认为最后一列还可以再分成(出生年,出生月,出生日),它就不是一范式了,否则就是;

第二范式
2NF是对记录的惟一性,要求记录有惟一标识,即实体的惟一性,即不存在部分依赖;
表:学号、课程号、姓名、学分;
这个表明显说明了两个事务:学生信息, 课程信息;由于非主键字段必须依赖主键,这里学分依赖课程号,姓名依赖与学号,所以不符合二范式。
正确做法:
学生:Student(学号, 姓名);
课程:Course(课程号, 学分);
选课关系:StudentCourse(学号, 课程号, 成绩)。
第三范式
3NF是对字段的冗余性,要求任何字段不能由其他字段派生出来,它要求字段没有冗余,即不存在传递依赖;

表: 学号, 姓名, 年龄, 学院名称, 学院电话
正确做法:
学生:(学号, 姓名, 年龄, 所在学院);
学院:(学院, 电话)。

范式化优缺点

优点


缺点