Database

Database

范式分解

3NF:

求最小函数依赖F
不在F中的属性单独拿出来做一个关系
其他的左右合起来就行

BCNF

求最新函数依赖F
求候选键
分析F中每个函数依赖
如果不符合BC范式(左边存在非候选键的)
分解成2个关系
左右合并作为一个分解。然后第二个关系要去掉第一个关系右边项

判断无损分解

画表。Alt text
一次分析每个依赖里面 a__i的。然后把对应右边关系的行,干成a_k.某行全a后就是无损分解

事务

ACID特性(原子、一致、隔离、持久性)

并发控制

保证正确调度、事务的隔离性、数据库一致性

潜在的不一致性

丢失修改

一个事务读后,另一个事务修改并写回了,然后之前那个事务又把修改过后的数据写进去(读后写)

读脏数据

读一个修改过的结果。。之后那个事务rollback了

不可重复读

1读取数据后,2更新,1无法再现结果
1类:修改后,再读不同值
2类:2删除了记录,再次读,1发现读不到
3类:2添加了记录,再次读,发现多了一些记录
2、3也称为幻影现象

X、S

X是排他 S是共享
X优先级最高。不能再加任何锁,直到释放
S只能+S锁 (有s锁不能加X锁,所以也叫读锁)

3级锁协议

1级

读取前,加X锁,事务完成后释放
(读数据不加锁,所以不能避免不可重复读和脏数据)

2级

1级+读取前先加S锁。读完就释放S
(可以防止丢失修改,脏数据,但是不能防止不可重复读)

3级

1级+加S,直到事务结束释放
全部能防

活锁

一个事务总是不能在一个数据项上加锁。-》采用先来先服务

死锁

等待另一个锁对象
都是死锁预防
方法:一次封锁(一次把需要锁的锁上,破坏占有并等待),顺序封锁(破除循环等待)

DBMS使用更多的是诊断并解除

检测并发调度正确性

可串行性是并行事务正确性的唯一准则
(凼且晋档结果与某一次序串行地执行结果相同)

2段锁协议

在读写前先加锁
在释放锁后不能再加任何锁

所有遵循两段锁的事物并行结果一定是正确的
可能死锁
一次封锁法满足2段锁协议

遵循3级封锁必然遵循2段锁

意向锁

锁强度 X>S+IX>S=IX>IS
IS与X不共存
IX与只与IS IX不互斥

封锁方法: 申请:自上而下 释放:自下而上

事务恢复

原则 已经做完的redo,做到一半的undo.redo从上到下扫描。undo从下到上扫描
Alt text

-------------End of this passage-------------