事务
定义:多个操作构成,完整的单元来进行管理
事务的四个特性:
原子性:都做或都不做
持久性(恢复机制保证):事务成功提交,事务对数据库的影响必须永久生效
一致性:约束关系不变
隔离性(并发控制保证):单个事务的执行,不受其他事务的影响
事务的状态:
活跃的
部分提交:执行完最后一条语句(系统还要做一些事)
失败
终止
提交
事务的并发执行
1.增加处理器和磁盘利用率
2.减少平均响应时间
调度:安排操作的执行顺序
调度包含所有事务的指令,保留单个事务内指令的执行顺序
串行调度(以事务为单位)和并发调度(以操作为单位)
可串行化
n个事务,有n!个串行调度的方案
冲突可串行化

一个调度是冲突可串行化的当且仅当前驱图没有环

等价的串行化就是对该图进行拓扑排序
可恢复调度:如果Tj读了被Ti修改过的数据项,Tj的提交操作必须在Ti的提交操作之后
级联回滚:一个事务的回滚会引起多个事务的回滚,会产生大量的开销
无级联回滚的调度:如果Tj读了被Ti修改过的数据项,Tj的读操作必须在Ti提交之后
无级联回滚一定是可恢复的
并发时不同的隔离级别:可串行化、可重复读、已提交读、未提交读
并发控制
基于锁的协议
1.互斥锁
2.共享锁
第一行是一个事务已经有的锁,第一列式另一个事务要加的锁,true表示不冲突,false表示冲突
两阶段锁有三个阶段:
两阶段锁协议、严格两阶段锁协议和强两阶段锁协议。
这三个阶段是不断增强的,目的是解决并发过程中出现的各种问题。
两阶段锁协议:指所有事务分两个阶段提出加锁和解锁申请
· 增长阶段:对任何数据进行读写操作之前,首先申请并获得该数据的封锁。
· 收缩阶段:在释放一个封锁后,事务不再申请和获得其他的任何封锁。
严格两阶段锁协议:
除了满足两阶段锁协议规定外,还要求事务的排它锁必须在事务提交之后释放。
强两阶段锁协议:
除了满足两阶段锁协议外,还要求所有锁都必须在事务提交之后释放。
关于三种两阶段锁的作用分析:
·两阶段锁:是保证冲突可串行化的充分条件。
举例:当一个调度中有连续的R1(A)W2(A)时,说明事务1已经UNLOCK A的锁了,(因为W2(A)需要申请排它锁,必须等事务1释放A的锁)并且不再申请其他锁,则事务1和2不会有冲突的动作,即冲突可串行化。
·严格两阶段锁:解决了级联回滚的问题;避免了脏读和丢失修改的问题。
级联回滚一般是由脏读引起的,所以解决脏读问题也就解决了级联回滚问题。
脏读是由于读了由其他事务更新得到的数据,而这个数据的更新还没有提交。
严格两阶段锁要求排它锁在事务提交后释放锁。而对于数据的更新要申请排它锁,对数据更新后提交事务再释放排它锁,这时其他事务才能申请锁来进行数据读取,而此时读取的数据就不再是脏数据。
解决丢失修改问题也是同理,在一个事务更新数据并提交后,其他事务才能申请锁进行更新提交,即前一个更新虽然被覆盖,但是并不是丢失。
两阶段锁协议
申请锁阶段:只能申请,不能释放
释放锁阶段:只能释放,不能申请
两阶段锁协议能保证冲突可串行化,但不能避免死锁
严格两阶段锁协议:所有事务的互斥锁保持到该事务提交/退出(无级联回滚)
强两阶段锁协议:所有事务的所有锁保持到该事务提交/退出

多粒度锁
粒度越小(如数据项),并发程度高,锁的管理复杂
粒度越大(如整个数据库),锁的管理简单
意向锁

相容性矩阵


解决死锁:
1.申请到所有资源
2.按照优先级申请资源
死锁检测
图中有环说明有死锁
死锁恢复
恢复
undo撤销事务,改到更新前的状态
redo重做事务,改到更新后的状态
幂等性:undo或redo多次的影响是一样的
回滚算法示例

监测点
1.所有日志都被安全的保存
2.将所有的缓冲块都OUTPUT到磁盘上了
3.记录一个<CHECKPOINT>


redo和undo




ER模型
实体集、联系集、属性
实体集(矩形)
属性(简单属性、复合属性、单值属性、多值属性(大括号)、导出属性)
联系集(菱形):实体集与实体集的某种语义关系
二元联系和三元联系,联系集也有可能有属性
映射关系:1.一对一 2.一对多 3.多对一 4.多对多
弱实体集(双矩形框):没有主键的实体集,依赖于强实体集
角色:课程与先修课
箭头表示1,无箭头表示多
单线表示部分参与,双线表示全参与

弱实体集:没有主键的实体集(员工和家属,家属是弱实体集,弱实体集一定依赖强/标识实体集)

构造顺序:实体集->联系集->属性
联系集的度是指它所关联的实体集的个数,ER模型一般度数为2
扩展ER
高层实体集、低层实体集(正交、重叠)
两者之间的关系:完全演绎、部分演绎
将多元联系转换为二元联系




实体集的转换
强实体集的转换,只取所有复合属性的叶子属性,多值属性要另外建一张表(该表的主键由原表主键和多值属性同时构成),导出属性要去掉
弱实体集的主键由它所依赖的强实体集的主键和弱实体集的部分键
联系集的转换
联系集的主键由所关联的两个实体集的主键构成,还要加上联系集的属性
一对多联系集的转换:可以把dept_name加入到instructor并看做是department的外键
函数依赖
a->b,a决定b,b依赖于a
超键:K->R
候选键:K->R and不存在K的真子集a ,a -> R,必须推出R中的所有关系
主属性:所有候选键中的属性的集合都属于主属性
平凡依赖
一定成立的依赖,如:ID,name -> ID
传递依赖
注意b -\->a是前提(id->schoolNo->name)
部分依赖
完全依赖
不存在上面的真子集
函数依赖集闭包
由已知F能推出来的,在R上成立的包含所有依赖关系的集合,记为F+
1NF
原子性,每一个属性都不可再分
2NF
在1NF的基础上,消除了非主属性对于主属性部分的函数依赖。
表中的非主属性必须完全依赖于候选键
判断方法:
1.找出数据表中的所有候选键
2.找出所有主属性和非主属性
3.判断所有的非主属性对候选键的部分函数依赖


3NF
表中的所有数据元素不但要能唯一地被主关键字所标识,而且它们之间还必须相互独立,不存在其他的函数关系
在2NF基础之上,消除传递函数依赖
在2NF基础之上,不存在非主属性对候选键的传递函数依赖
任何一个关系模型都要满足
1.要么是平凡依赖
2.要么左边是超键
3.要么右边是键属性(主属性)


BCNF
消除主属性对主键的部分和传递依赖
不存在主属性对候选键的部分和传递依赖
所有函数依赖关系满足
1.要么是平凡依赖
2.要么左边全是超键
4NF
消除表中的多值依赖
无损连接的判定

函数依赖保持的判定

第三范式分解算法

BCNF分解算法

索引
1. 聚集索引(Clustered Index)
- 定义:聚集索引决定了表中数据的物理存储顺序。一个表只能有一个聚集索引,因为数据只能按照一种顺序存储。
- 特点:
- 数据的物理顺序和索引顺序相同。
- 通常用于主键或频繁查询的列。
- 查询效率高,特别是范围查询。
- 插入、删除、更新操作可能会比较慢,因为需要保持物理顺序。
2. 主索引(Primary Index)
- 定义:主索引通常指的是在主键列上创建的索引。主键是唯一标识每一行记录的列或列的组合。
- 特点:
- 主索引通常是聚集索引,但并不一定非要是聚集索引。
- 主键值必须唯一且非空。
- 主索引确保表中每一行的唯一性。
3. 辅助索引(Secondary Index)
- 定义:辅助索引是指除了主索引之外的其他索引,也称为非聚集索引(Non-Clustered Index)。
- 特点:
- 一个表可以有多个辅助索引。
- 辅助索引不会影响数据的物理存储顺序。
- 辅助索引存储指向数据记录的指针。
- 对于查询优化非常有用,尤其是涉及多个列的查询。
4. 唯一索引(Unique Index)
- 定义:唯一索引确保索引列中的所有值都是唯一的,没有重复值。
- 特点:
- 强制列中的每个值都是唯一的。
- 可以在多个列上创建唯一索引。
- 自动用于主键,但也可以用于非主键列。
- 有助于确保数据完整性。
稠密索引:数据文件中所有search-key的值在索引文件中都出现
稀疏索引
聚集索引:数据文件中的数据记录的排列顺序与索引文件中的索引项的排列顺序一致

辅助索引一定是稠密的,否则可能找不到记录
索引的SQL语句

关系代数


θ连接


自然连接:属性名相同、值相等


除



外连接

SQL语句


视图
1 | CREATE VIEW v AS <query expression> |
权限
User-Role-Privilege
设置权限

收回权限


触发器

for each statement/row
referencing old/new table
referencing old/new row as...
