数据库系统原理

2019-02-13

1 范式

范式的目标

  1. 减少数据冗余;
  2. 消除异常(插入异常,更新异常,删除异常);
  3. 让数据组织的更加和谐。

范式:是为了消除重复数据减少冗余数据,从而让数据库内的数据更好的组织,让磁盘空间得到更有效利用的一种标准化标准满足高等级的范式的先决条件是满足低等级范式。(比如满足2nf一定满足1nf)

  • 第一范式:第一范式又称为1NF(First Normal Form),是对关系模式的基本要求,不满足第一范式的数据库就不是关系数据库。第一范式就是每一个属性都不可再分
  • 第二范式:第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式必须先满足第一范式(1NF)。第二范式就是属性应完全依赖于其主键
  • 第三范式:满足第三范式(3NF)必须先满足第二范式(2NF)。第三范式就是任一非主键属性不应依赖于其它任何非主键属性
  • BC范式:BC范式是在第三范式的基础上的一种特殊情况,BC范式就是任一属性不应依赖于其它非主键属性,既每个表中只有一个候选键(在一个数据库中每行的值都不相同,则可称为候选键)。
  • 第四范式:满足第四范式(4NF)必须先满足BC范式(BCNF),第四范式(4NF)是消除表中的多值依赖,也就是说可以减少维护数据一致性的工作。

参见:

2 事务

事务指的是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚。

2.1 ACID

  1. 原子性(Atomicity)
    • 事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。
    • 回滚可以用日志来实现,日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可。
  2. 一致性(Consistency)
    • 数据库在事务执行前后都保持一致性状态。在一致性状态下,所有事务对一个数据的读取结果都是相同的。
  3. 隔离性(Isolation)
    • 一个事务所做的修改在最终提交以前,对其它事务是不可见的。
  4. 持久性(Durability)
    • 一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。
    • 可以通过数据库备份和恢复来实现,在系统发生崩溃时,使用备份的数据库进行数据恢复。

MySQL 默认采用自动提交模式。也就是说,如果不显式使用START TRANSACTION语句来开始一个事务,那么每个查询都会被当做一个事务自动提交。

3 并发一致性问题

一个数据库可能拥有多个访问客户端,这些客户端都可以并发方式访问数据库。数据库中的相同数据可能同时被多个事务访问,如果没有采取必要的隔离措施,就会导致各种并发问题,破坏数据的完整性。

  • 丢失修改:T1T2 两个事务都对一个数据进行修改,T1 先修改,T2 随后修改,T2 的修改覆盖了 T1 的修改。
  • 读脏数据:T1 修改一个数据,T2 随后读取这个数据。如果 T1 撤销了这次修改,那么 T2 读取的数据是脏数据。
  • 不可重复读:T2 读取一个数据,T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。
  • 幻影读:T1 读取某个范围的数据,T2 在这个范围内插入新的数据,T1 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。幻影读和不可重复读是两个容易混淆的概念,前者是指读到了其它已经提交事务的新增数据,而后者是指读到了已经提交事务的更改数据(更改或删除)

4 事务隔离级别

  1. 未提交读(READ UNCOMMITTED):事务中的修改,即使没有提交,对其它事务也是可见的。
  2. 提交读(READ COMMITTED):一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务所做的修改在提交之前对其它事务是不可见的。
  3. 可重复读(REPEATABLE READ):保证在同一个事务中多次读取同样数据的结果是一样的。
  4. 可串行化(SERIALIZABLE):强制事务串行执行。
隔离级别 脏读 不可重复读 幻影读
未提交读
提交读 ×
可重复读 × ×
可串行化 × × ×

参考文献

数据库事务管理与隔离级别
Interview-Notebook——数据库系统原理