2NF
非主键属性全部依赖于主键,所以至少是2NF,但是由于非主键属性间存在相互依赖,所以必然不是3NF
2NF可以允许非主键属性间相互依赖
3NF
候选键为BDEF
显然A->C,C->A不是BCNF也不是3NF,因为左侧不是超键,右侧也不是候选键一部分
B->AC,D->AC也不是
原函数依赖集即最小函数依赖集,构建出4个表,由于没有候选键,所以再添个候选键的新表
接着删依据子集包含删表,删掉一个AC表,
所以最后剩下4个表,分别为{AC}{ABC}{ACD}{BDEF}
两阶段锁
对于调度Q,T3要对A上X锁,但是T4为了保证可重复读,上了S锁,所以T3要等待T4解锁A的S锁,但是T4因为T3上了B的X锁,也要上T3的S锁,就会等待T3的B锁的解锁,所以造成了死锁
对于P,由于是对A,B都先上了锁,所以T4无法对A上锁,必须先等T3开锁A才能继续执行
如果T10撤销,那么会引发级联回滚,因为T11,T12读了T10写的数据
若T5撤销不会级联回滚
应当要避免级联回滚,就是一个事务的回滚导致其它事务也回滚
之所以不会级联回滚是因为T6,T7要读的时候,T5还没有开锁,那么T6,T7必须等T5开锁才行,而T5开锁后紧接着就是回滚了
而调度Q不行就是因为它T10开锁后,紧接着的不是回滚,而是其它事务的读操作
第一阶段T2要对A上X锁,对B上X锁
T1要对B上X锁,对C上S锁
T3要对B上S锁,对C上X锁
由调度优先图,可以明确这个是可以冲突串行化的
但是冲突串行化并不一定就能二阶段
T2里A的锁无所谓,一开始先上AB的X锁,读完B后就开B的X锁,接着T1上B的X锁,C的S锁,T1写完B后开B的X锁,进入缩减阶段,接着T3对B上S锁,T1读完C后开C的S锁,T3再上C的X锁,所以是可以二阶段封锁协议的
多粒度锁
时间戳排序协议
基于日志的恢复
T0回滚了,那么就对T0的操作都是UNDO(T0)
T1没提交也没回滚,所以也是UNDO(T1)
T1,T2需要重做
SQL
B