RDBMS 课程笔记 | 青训营笔记

102 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天。

本文以 CC-BY-SA 4.0 发布。

RDBMS

RDBMS 是关系型数据库(Relational Database Management System)的缩写。

常见概念

  • ACID:对数据库事务操作的四个要求的缩写

    • A: Atomicity: 原子性、不可分性,对于其它的事务而言, 一个事务要不就是已经完成了,要么就是完全没有发生。
    • C: Consistency: 一致性,事务操作绝对不能损坏数据库各个组分之间的一致性, 不应该出现类似唯一性索引被无视或是数据损毁等情况。
    • I: Isolation: 隔离性,各个并发的事务之间不应出现相互干扰的情况。 因为实现的开销等问题,很多数据库都会提供多种不同的隔离等级。
    • D: Durability: 持久性,事务被提交之后,无论出现怎样的事故, 如网络中断、宕机、断电等(硬盘损坏等导致数据库损坏的大概除外), 这个事务都会被维持在提交的状态,不会遗失相关数据或是被撤销。
  • 隔离等级:并发的事务之间的相互干扰的完全隔离可能开销较大,所以有隔离等级可选。 下面四个从上到下的开销依次增大, 一般数据库的隔离等级大概默认设在“repeatable read”。

    • Read uncommitted: 可以读到其它事务未提交的数据,基本就是说放弃隔离了。
    • Read committed: 可以读到其它事务已经提交的数据。
    • Repeatable read: 保证每次读到的数据的值都不受其它事务的影响。 (见下面的“幻读”。)
    • Serializable: 顺序执行事务。
  • 隔离不足的现象:人们把隔离不足时发生的一些现象取了名字。 (下面的是我对维基内容的理解。)

    • Dirty read: 脏读:能够读到其它事务的临时数据,比如未提交的(随时可以撤回的)数据。

    • Non-repeatable read: 不可重复的读操作:读第一次是 A, 在没有更新任何值的操作下,第二次读出的值就变成 B 了。

    • Phantom read: 幻读:读第一次是一行数据,读第二次就是两行数据了。 (注意不可重复读是值变化,幻读是以行为单位的变化。)

    • 隔离等级与其可以避免的现象:

      脏读不可重复读幻读
      Serializable
      Repeatable read
      Read committed
      Read uncommitted
    • 原理:不同的隔离等级一般对应的是不同的锁。(不一定是用锁实现的,但是可以这样理解。)

      • SELECT 会对应一个读者锁。
      • Read committed 把对应的写者锁留到事务结束再释放。
      • Repeatable read 把对应的读者锁也留到事务结束再释放。
      • Serializable 可以看作把事务变为单行线。但如果底层是并行的实现的话,有写冲突时,只有一个事务可以最终提交。