diff --git a/docs/notes/数据库系统原理.md b/docs/notes/数据库系统原理.md
index 9aaa6b4e..42cad107 100644
--- a/docs/notes/数据库系统原理.md
+++ b/docs/notes/数据库系统原理.md
@@ -130,7 +130,6 @@ MySQL 中提供了两种封锁粒度:行级锁以及表级锁。
在选择封锁粒度时,需要在锁开销和并发程度之间做一个权衡。
-
## 封锁类型
@@ -148,8 +147,8 @@ MySQL 中提供了两种封锁粒度:行级锁以及表级锁。
| - | X | S |
| :--: | :--: | :--: |
-|X|×|×|
-|S|×|√|
+| **X** |×|×|
+| **S** |×|√|
### 2. 意向锁
@@ -168,10 +167,10 @@ MySQL 中提供了两种封锁粒度:行级锁以及表级锁。
| - | X | IX | S | IS |
| :--: | :--: | :--: | :--: | :--: |
-|X |× |× |× | ×|
-|IX |× |√ |× | √|
-|S |× |× |√ | √|
-|IS |× |√ |√ | √|
+| **X** |× |× |× | ×|
+| **IX** |× |√ |× | √|
+| **S** |× |× |√ | √|
+| **IS** |× |√ |√ | √|
解释如下:
@@ -292,14 +291,16 @@ SELECT ... FOR UPDATE;
强制事务串行执行。
+需要加锁实现,而其它隔离级别通常不需要。
+
----
-| 隔离级别 | 脏读 | 不可重复读 | 幻影读 | 加锁读 |
-| :---: | :---: | :---:| :---: | :---: |
-| 未提交读 | √ | √ | √ | × |
-| 提交读 | × | √ | √ | × |
-| 可重复读 | × | × | √ | × |
-| 可串行化 | × | × | × | √ |
+| 隔离级别 | 脏读 | 不可重复读 | 幻影读 |
+| :---: | :---: | :---:| :---: |
+| 未提交读 | √ | √ | √ |
+| 提交读 | × | √ | √ |
+| 可重复读 | × | × | √ |
+| 可串行化 | × | × | × |
# 五、多版本并发控制
@@ -327,7 +328,7 @@ MVCC 使用到的快照存储在 Undo 日志中,该日志通过回滚指针把
以下实现过程针对可重复读隔离级别。
-当开始新一个事务时,该事务的版本号肯定会大于当前所有数据行快照的创建版本号,理解这一点很关键。
+当开始一个事务时,该事务的版本号肯定大于当前所有数据行快照的创建版本号,理解这一点很关键。数据行快照的创建版本号是创建数据行快照时的系统版本号,系统版本号随着创建事务而递增,因此新创建一个事务时,这个事务的系统版本号比之前的系统版本号都大,也就是比所有数据行快照的创建版本号都大。
### 1. SELECT
@@ -373,7 +374,7 @@ delete;
Next-Key Locks 是 MySQL 的 InnoDB 存储引擎的一种锁实现。
-MVCC 不能解决幻读的问题,Next-Key Locks 就是为了解决这个问题而存在的。在可重复读(REPEATABLE READ)隔离级别下,使用 MVCC + Next-Key Locks 可以解决幻读问题。
+MVCC 不能解决幻影读问题,Next-Key Locks 就是为了解决这个问题而存在的。在可重复读(REPEATABLE READ)隔离级别下,使用 MVCC + Next-Key Locks 可以解决幻读问题。
## Record Locks
@@ -394,11 +395,11 @@ SELECT c FROM t WHERE c BETWEEN 10 and 20 FOR UPDATE;
它是 Record Locks 和 Gap Locks 的结合,不仅锁定一个记录上的索引,也锁定索引之间的间隙。例如一个索引包含以下值:10, 11, 13, and 20,那么就需要锁定以下区间:
```sql
-(negative infinity, 10]
+(-∞, 10]
(10, 11]
(11, 13]
(13, 20]
-(20, positive infinity)
+(20, +∞)
```
# 七、关系数据库设计理论
@@ -415,7 +416,7 @@ SELECT c FROM t WHERE c BETWEEN 10 and 20 FOR UPDATE;
## 异常
-以下的学生课程关系的函数依赖为 Sno, Cname -> Sname, Sdept, Mname, Grade,键码为 {Sno, Cname}。也就是说,确定学生和课程之后,就能确定其它信息。
+以下的学生课程关系的函数依赖为 {Sno, Cname} -> {Sname, Sdept, Mname, Grade},键码为 {Sno, Cname}。也就是说,确定学生和课程之后,就能确定其它信息。
| Sno | Sname | Sdept | Mname | Cname | Grade |
| :---: | :---: | :---: | :---: | :---: |:---:|
@@ -437,8 +438,6 @@ SELECT c FROM t WHERE c BETWEEN 10 and 20 FOR UPDATE;
高级别范式的依赖于低级别的范式,1NF 是最低级别的范式。
-
-
### 1. 第一范式 (1NF)
属性不可分。
@@ -537,7 +536,7 @@ Entity-Relationship,有三个组成部分:实体、属性、联系。
下图的 Course 和 Student 是一对多的关系。
-
+
## 表示出现多次的关系
@@ -545,23 +544,19 @@ Entity-Relationship,有三个组成部分:实体、属性、联系。
下图表示一个课程的先修关系,先修关系出现两个 Course 实体,第一个是先修课程,后一个是后修课程,因此需要用两条线来表示这种关系。
-
+
## 联系的多向性
虽然老师可以开设多门课,并且可以教授多名学生,但是对于特定的学生和课程,只有一个老师教授,这就构成了一个三元联系。
-
-
-一般只使用二元联系,可以把多元联系转换为二元联系。
-
-
+
## 表示子类
用一个三角形和两条线来连接类和子类,与子类有关的属性和联系都连到子类上,而与父类和子类都有关的连到父类上。
-
+
# 参考资料
diff --git a/docs/pics/14389ea4-8d96-4e96-9f76-564ca3324c1e.png b/docs/pics/14389ea4-8d96-4e96-9f76-564ca3324c1e.png
new file mode 100644
index 00000000..71b87153
Binary files /dev/null and b/docs/pics/14389ea4-8d96-4e96-9f76-564ca3324c1e.png differ
diff --git a/docs/pics/1d28ad05-39e5-49a2-a6a1-a6f496adba6a.png b/docs/pics/1d28ad05-39e5-49a2-a6a1-a6f496adba6a.png
new file mode 100644
index 00000000..7c7cce6d
Binary files /dev/null and b/docs/pics/1d28ad05-39e5-49a2-a6a1-a6f496adba6a.png differ
diff --git a/docs/pics/5bb1b38a-527e-4802-a385-267dadbd30ba.png b/docs/pics/5bb1b38a-527e-4802-a385-267dadbd30ba.png
new file mode 100644
index 00000000..fb1a182c
Binary files /dev/null and b/docs/pics/5bb1b38a-527e-4802-a385-267dadbd30ba.png differ
diff --git a/docs/pics/ac929ea3-daca-40ec-9e95-4b2fa6678243.png b/docs/pics/ac929ea3-daca-40ec-9e95-4b2fa6678243.png
new file mode 100644
index 00000000..a9361a1e
Binary files /dev/null and b/docs/pics/ac929ea3-daca-40ec-9e95-4b2fa6678243.png differ
diff --git a/notes/pics/14389ea4-8d96-4e96-9f76-564ca3324c1e.png b/notes/pics/14389ea4-8d96-4e96-9f76-564ca3324c1e.png
new file mode 100644
index 00000000..71b87153
Binary files /dev/null and b/notes/pics/14389ea4-8d96-4e96-9f76-564ca3324c1e.png differ
diff --git a/notes/pics/1d28ad05-39e5-49a2-a6a1-a6f496adba6a.png b/notes/pics/1d28ad05-39e5-49a2-a6a1-a6f496adba6a.png
new file mode 100644
index 00000000..7c7cce6d
Binary files /dev/null and b/notes/pics/1d28ad05-39e5-49a2-a6a1-a6f496adba6a.png differ
diff --git a/notes/pics/5bb1b38a-527e-4802-a385-267dadbd30ba.png b/notes/pics/5bb1b38a-527e-4802-a385-267dadbd30ba.png
new file mode 100644
index 00000000..fb1a182c
Binary files /dev/null and b/notes/pics/5bb1b38a-527e-4802-a385-267dadbd30ba.png differ
diff --git a/notes/pics/ac929ea3-daca-40ec-9e95-4b2fa6678243.png b/notes/pics/ac929ea3-daca-40ec-9e95-4b2fa6678243.png
new file mode 100644
index 00000000..a9361a1e
Binary files /dev/null and b/notes/pics/ac929ea3-daca-40ec-9e95-4b2fa6678243.png differ
diff --git a/notes/数据库系统原理.md b/notes/数据库系统原理.md
index 8349c645..b02b078c 100644
--- a/notes/数据库系统原理.md
+++ b/notes/数据库系统原理.md
@@ -130,7 +130,6 @@ MySQL 中提供了两种封锁粒度:行级锁以及表级锁。
在选择封锁粒度时,需要在锁开销和并发程度之间做一个权衡。
-
## 封锁类型
@@ -148,8 +147,8 @@ MySQL 中提供了两种封锁粒度:行级锁以及表级锁。
| - | X | S |
| :--: | :--: | :--: |
-|X|×|×|
-|S|×|√|
+| **X** |×|×|
+| **S** |×|√|
### 2. 意向锁
@@ -168,10 +167,10 @@ MySQL 中提供了两种封锁粒度:行级锁以及表级锁。
| - | X | IX | S | IS |
| :--: | :--: | :--: | :--: | :--: |
-|X |× |× |× | ×|
-|IX |× |√ |× | √|
-|S |× |× |√ | √|
-|IS |× |√ |√ | √|
+| **X** |× |× |× | ×|
+| **IX** |× |√ |× | √|
+| **S** |× |× |√ | √|
+| **IS** |× |√ |√ | √|
解释如下:
@@ -292,14 +291,16 @@ SELECT ... FOR UPDATE;
强制事务串行执行。
+需要加锁实现,而其它隔离级别通常不需要。
+
----
-| 隔离级别 | 脏读 | 不可重复读 | 幻影读 | 加锁读 |
-| :---: | :---: | :---:| :---: | :---: |
-| 未提交读 | √ | √ | √ | × |
-| 提交读 | × | √ | √ | × |
-| 可重复读 | × | × | √ | × |
-| 可串行化 | × | × | × | √ |
+| 隔离级别 | 脏读 | 不可重复读 | 幻影读 |
+| :---: | :---: | :---:| :---: |
+| 未提交读 | √ | √ | √ |
+| 提交读 | × | √ | √ |
+| 可重复读 | × | × | √ |
+| 可串行化 | × | × | × |
# 五、多版本并发控制
@@ -327,7 +328,7 @@ MVCC 使用到的快照存储在 Undo 日志中,该日志通过回滚指针把
以下实现过程针对可重复读隔离级别。
-当开始新一个事务时,该事务的版本号肯定会大于当前所有数据行快照的创建版本号,理解这一点很关键。
+当开始一个事务时,该事务的版本号肯定大于当前所有数据行快照的创建版本号,理解这一点很关键。数据行快照的创建版本号是创建数据行快照时的系统版本号,系统版本号随着创建事务而递增,因此新创建一个事务时,这个事务的系统版本号比之前的系统版本号都大,也就是比所有数据行快照的创建版本号都大。
### 1. SELECT
@@ -373,7 +374,7 @@ delete;
Next-Key Locks 是 MySQL 的 InnoDB 存储引擎的一种锁实现。
-MVCC 不能解决幻读的问题,Next-Key Locks 就是为了解决这个问题而存在的。在可重复读(REPEATABLE READ)隔离级别下,使用 MVCC + Next-Key Locks 可以解决幻读问题。
+MVCC 不能解决幻影读问题,Next-Key Locks 就是为了解决这个问题而存在的。在可重复读(REPEATABLE READ)隔离级别下,使用 MVCC + Next-Key Locks 可以解决幻读问题。
## Record Locks
@@ -394,11 +395,11 @@ SELECT c FROM t WHERE c BETWEEN 10 and 20 FOR UPDATE;
它是 Record Locks 和 Gap Locks 的结合,不仅锁定一个记录上的索引,也锁定索引之间的间隙。例如一个索引包含以下值:10, 11, 13, and 20,那么就需要锁定以下区间:
```sql
-(negative infinity, 10]
+(-∞, 10]
(10, 11]
(11, 13]
(13, 20]
-(20, positive infinity)
+(20, +∞)
```
# 七、关系数据库设计理论
@@ -415,7 +416,7 @@ SELECT c FROM t WHERE c BETWEEN 10 and 20 FOR UPDATE;
## 异常
-以下的学生课程关系的函数依赖为 Sno, Cname -> Sname, Sdept, Mname, Grade,键码为 {Sno, Cname}。也就是说,确定学生和课程之后,就能确定其它信息。
+以下的学生课程关系的函数依赖为 {Sno, Cname} -> {Sname, Sdept, Mname, Grade},键码为 {Sno, Cname}。也就是说,确定学生和课程之后,就能确定其它信息。
| Sno | Sname | Sdept | Mname | Cname | Grade |
| :---: | :---: | :---: | :---: | :---: |:---:|
@@ -437,8 +438,6 @@ SELECT c FROM t WHERE c BETWEEN 10 and 20 FOR UPDATE;
高级别范式的依赖于低级别的范式,1NF 是最低级别的范式。
-
-
### 1. 第一范式 (1NF)
属性不可分。
@@ -537,7 +536,7 @@ Entity-Relationship,有三个组成部分:实体、属性、联系。
下图的 Course 和 Student 是一对多的关系。
-
+
## 表示出现多次的关系
@@ -545,23 +544,19 @@ Entity-Relationship,有三个组成部分:实体、属性、联系。
下图表示一个课程的先修关系,先修关系出现两个 Course 实体,第一个是先修课程,后一个是后修课程,因此需要用两条线来表示这种关系。
-
+
## 联系的多向性
虽然老师可以开设多门课,并且可以教授多名学生,但是对于特定的学生和课程,只有一个老师教授,这就构成了一个三元联系。
-
-
-一般只使用二元联系,可以把多元联系转换为二元联系。
-
-
+
## 表示子类
用一个三角形和两条线来连接类和子类,与子类有关的属性和联系都连到子类上,而与父类和子类都有关的连到父类上。
-
+
# 参考资料