这是我参与「第五届青训营 」伴学笔记创作活动的第 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 可以看作把事务变为单行线。但如果底层是并行的实现的话,有写冲突时,只有一个事务可以最终提交。
-