diff --git a/notes/数据库系统原理.md b/notes/数据库系统原理.md
index 5407c48b..36d70d29 100644
--- a/notes/数据库系统原理.md
+++ b/notes/数据库系统原理.md
@@ -3,25 +3,25 @@
* [数据库系统原理](#数据库系统原理)
* [一、事务](#一事务)
* [概念](#概念)
- * [ACID](#acid)
+ * [ACID](#acid) 🔥
* [AUTOCOMMIT](#autocommit)
- * [二、并发一致性问题](#二并发一致性问题)
+ * [二、并发一致性问题](#二并发一致性问题) 🔥
* [丢失修改](#丢失修改)
* [脏读](#脏读)
* [不可重复读](#不可重复读)
* [幻读](#幻读)
- * [三、封锁](#三封锁)
+ * [三、封锁](#三封锁) 🔥🔥
* [封锁粒度](#封锁粒度)
* [封锁类型](#封锁类型)
* [封锁协议](#封锁协议)
* [MySQL 隐式与显式锁定](#mysql-隐式与显式锁定)
* [MySQL 中的锁](#mysql-中的锁)
- * [四、隔离级别](#四隔离级别)
+ * [四、隔离级别](#四隔离级别) 🔥🔥
* [未提交读(READ UNCOMMITTED)](#未提交读read-uncommitted)
* [提交读(READ COMMITTED)](#提交读read-committed)
* [可重复读(REPEATABLE READ)](#可重复读repeatable-read)
* [可串行化(SERIALIZABLE)](#可串行化serializable)
- * [五、多版本并发控制](#五多版本并发控制)
+ * [五、多版本并发控制](#五多版本并发控制) 🔥🔥
* [基本思想](#基本思想)
* [版本号](#版本号)
* [Undo 日志](#undo-日志)
@@ -34,7 +34,7 @@
* [七、关系数据库设计理论](#七关系数据库设计理论)
* [函数依赖](#函数依赖)
* [异常](#异常)
- * [范式](#范式)
+ * [范式](#范式) 🔥
* [八、ER 图](#八er-图)
* [实体的三种联系](#实体的三种联系)
* [表示出现多次的关系](#表示出现多次的关系)
@@ -61,7 +61,7 @@
-### ACID
+### ACID 🔥
#### 1. 原子性(Atomicity)
@@ -105,7 +105,7 @@
MySQL 默认采用自动提交模式。也就是说,如果不显式使用 START TRANSACTION 或 BEGIN 开始一个事务,那么每条语句都会被当做一个事务并自动提交。
-## 二、并发一致性问题
+## 二、并发一致性问题 🔥
在并发环境下,事务的隔离性很难保证,因此会出现很多并发一致性问题。以下例子中,表 account 原有 id 为 1、2 的两行,余额都是 100,图中的结果是在 MySQL 8.0 上用两个会话实际执行得到的(见[附录 A1](#a1-并发一致性问题))。
@@ -139,7 +139,7 @@ InnoDB 在可重复读下如何避免幻读,见 [六、Next-Key Locks](#六nex
产生并发不一致性问题的主要原因是破坏了事务的隔离性,解决方法是通过并发控制来保证隔离性。并发控制可以通过封锁来实现,但是封锁操作需要用户自己控制,相当复杂。数据库管理系统提供了事务的隔离级别,让用户以一种更轻松的方式处理并发一致性问题。
-## 三、封锁
+## 三、封锁 🔥🔥
### 封锁粒度
@@ -291,7 +291,7 @@ C 只是一条普通的查询,也被阻塞了。这是因为 B 在等待 MDL
以上都是悲观锁。数据库中的乐观锁一般用版本号实现,不需要加锁,见 [乐观锁与悲观锁](Java%20并发.md#4-乐观锁与悲观锁)。
-## 四、隔离级别
+## 四、隔离级别 🔥🔥
### 未提交读(READ UNCOMMITTED)
@@ -346,7 +346,7 @@ SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 当前会话之后
MySQL 8.0 已移除旧的变量名 tx_isolation。SET TRANSACTION 不写 SESSION 或 GLOBAL 时,只对下一个事务有效。
-## 五、多版本并发控制
+## 五、多版本并发控制 🔥🔥
多版本并发控制(Multi-Version Concurrency Control, MVCC)是 MySQL 的 InnoDB 存储引擎实现隔离级别的一种具体方式,用于实现提交读和可重复读这两种隔离级别。而未提交读隔离级别总是读取最新的数据行,要求很低,无需使用 MVCC。可串行化隔离级别需要对所有读取的行都加锁,单纯使用 MVCC 无法实现。
@@ -515,7 +515,7 @@ SELECT c FROM t WHERE c BETWEEN 10 and 20 FOR UPDATE;
- 删除异常:删除一个信息,那么也会丢失其它信息。例如删除了 `课程-1` 需要删除第一行和第三行,那么 `学生-1` 的信息就会丢失。
- 插入异常:例如想要插入一个学生的信息,如果这个学生还没选课,那么就无法插入。
-### 范式
+### 范式 🔥
范式理论是为了解决以上提到四种异常。