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` 的信息就会丢失。 - 插入异常:例如想要插入一个学生的信息,如果这个学生还没选课,那么就无法插入。 -### 范式 +### 范式 🔥 范式理论是为了解决以上提到四种异常。