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 实体,第一个是先修课程,后一个是后修课程,因此需要用两条线来表示这种关系。 -

+

## 联系的多向性 虽然老师可以开设多门课,并且可以教授多名学生,但是对于特定的学生和课程,只有一个老师教授,这就构成了一个三元联系。 -

- -一般只使用二元联系,可以把多元联系转换为二元联系。 - -

+

## 表示子类 用一个三角形和两条线来连接类和子类,与子类有关的属性和联系都连到子类上,而与父类和子类都有关的连到父类上。 -

+

# 参考资料