前言

内容:

  • 模式分解

    • 保持函数依赖分解
    • 无损分解
  • 事务并发

  • 封锁协议

中论

模式分解

保持函数依赖分解

对于关系模式R,有依赖集F,若对R进行分解,分解出来的多个关系模式,保持原来的依赖集不变,则称为保持函数依赖分解。

保持函数依赖的判断:

  1. 如果F上的每一个函数依赖都在其分解后的某一个关系上成立,则这分解就是保持函数依赖分解。(充分条件)

    看分解后的集合,每一个集合是否都能推出函数依赖集,如果都能则是保持函数依赖,反之不保持。

    (注意:这个推出不包含传递依赖推导出。比如A–>B,B–>C。则分解的U={A,B},就不是保持函数依赖分解。因为A–>B,但是没有A–>C。

  2. 如果1不能确定是保持函数依赖分解,有方法2。略。

无损分解

分解后的关系模式能够还原出原关系模式,就是无损分解,不能还原的就是有损。

无损分解的判断:

  1. 分解为两个关系模式时,如果R分解为p={R1,R2},F为R所满足的函数依赖集合,分解p具有无损连接性的充分必要条件是R1∩R2-->(R1-R2)或者R1∩R2-->(R2-R1)
  2. 分解为三个或三个以上关系模式时,表格法。
    1. 构建初始表。行为每个分解的表,列为分解后的列取并集
    2. 首先根据分解后的表,在对应格子打钩
    3. 然后根据函数依赖打钩
    4. 最后只要有一列全是钩,则是无损分解

并发控制

事务

  • 原子性:要么全做,要么不做
  • 隔离性:任一事务的更新操作直到成功提交之前对其他事务不可见
  • 一致性:事务发生后数据一致
  • 持续性:事务操作结果是持续的

并发控制的问题

  • 丢失更新
  • 不可重复读
  • 读脏数据

image-20240419211430996

封锁协议

  • X锁是排他锁(写锁)。某事务对数据A加此锁,其他事务都不可对A加任何锁。
  • S锁是共享锁(读锁)。某事务对数据A加此锁,其他事务只可以对A加S锁。

一级封锁协议

在事务修改数据A之前先对其加X锁,直到事务结束释放。可解决丢失更新问题。

image-20240419211755086

二级封锁协议

在一级封锁协议的基础上,事务在读数据R之前必须先对其加S锁,读完后即可释放S锁。可解决读脏数据、丢失更新的问题。

image-20240419211927173

三级封锁协议

在一级封锁协议的基础上,事务在读取数据R之前先对其加S锁,知道事务结束才释放。可解决丢失更新、读脏数据、数据重复读的问题。

image-20240419212047920

一级:侧重写的时候加X锁。

二级:在一级的基础上,侧重读的时候加S锁,读完即释放。

三级:在一级的基础上,侧重读的时候加S锁,事务结束释放。

后记

真的要自己争气,人一旦做出成绩来,全世界都和颜悦色。——————佚名