25 February 2014

关系的三类完整性约束


  • 实体完整性

若属性(指一个或一组属性)A是基本关系R的主属性,则A不能取空值。

  • 参照完整性

若属性(或属性组)F是基本关系R的外码,它与基本关系S的主码K相对应(或者说F引用了K),则对于R中每个元组在F上的值必须为:或者取空值;或者等于S中某个元组的主码值。

  • 用户定义的完整性

针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。

范式


  • 1NF

每一个分量必须是不可分的数据项。

  • 2NF

若R属于1NF,且每一个非主属性完全函数依赖于码,则R属于2NF。

  • 3NF

若R属于2NF,且每一个非主属性不传递依赖于码。

  • BCNF

所有非主属性对每一个码都是完全函数依赖;

所有的主属性对每一个不包含它的码,也是完全函数依赖;

没有任何属性完全函数依赖于非码的任何一组属性。

  • 4NF

若R属于1NF,且对于R的每个非平凡多值依赖X->->Y(Y不属于X),X都含有码。

属性之间不允许有非平凡且非函数依赖的多值依赖。

事务


用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。

  • 原子性:事务是数据库的逻辑工作单位,事务中包括的操作要么都做,要么都不做。
  • 一致性:事务的执行结果必须是使数据库从一个一致性状态变到另一个一致性状态。即当事务执行不成功时,该事务已经执行的操作需要被回滚。
  • 隔离性:一个事务的执行不能被其他事务干扰。
  • 持续性:一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。

隔离级别


  • 读未提交(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据。
  • 读提交(Read Committed):允许不可重复读取,但不允许脏读取。
  • 可重复读取(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现读幻影数据。
  • 序列化(Serializable):提供严格的事务隔离,它要求多个事务并发执行时的正确性,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同,避免了幻读。

所谓幻影数据是指:两个并发的事务 T1 和 T2,当事务 T1 按一定条件从数据库中读取了某些数据记录后,事务 T2 删除了其中部分记录,当 T1 再次按相同条件读取数据时,发现某些记录消失了;当事务 T1 按一定条件从数据库中读取某些数据记录后,事务 T2 插入了一些记录,当 T1 再次按相同条件读取数据时,发现多了一些记录。

并发操作带来的数据不一致性:

丢失修改(Lost Update)

Lost Update

不可重复读(Non-repeatable Read)

Non-repeatable Read

读“脏”数据(Dirty Read)

Dirty Read

隔离级别 丢失修改 脏读 不可重复读 幻读 加锁读
读未提交 No Yes Yes Yes No
读提交 No No Yes Yes No
可重复读 No No No Yes No
序列化 No No No No Yes