Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
wushizhenking
CS-Notes
提交
7fa78333
C
CS-Notes
项目概览
wushizhenking
/
CS-Notes
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
CS-Notes
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
7fa78333
编写于
5月 18, 2019
作者:
C
CyC2018
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
auto commit
上级
b78a5870
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
46 addition
and
56 deletion
+46
-56
docs/notes/数据库系统原理.md
docs/notes/数据库系统原理.md
+23
-28
docs/pics/14389ea4-8d96-4e96-9f76-564ca3324c1e.png
docs/pics/14389ea4-8d96-4e96-9f76-564ca3324c1e.png
+0
-0
docs/pics/1d28ad05-39e5-49a2-a6a1-a6f496adba6a.png
docs/pics/1d28ad05-39e5-49a2-a6a1-a6f496adba6a.png
+0
-0
docs/pics/5bb1b38a-527e-4802-a385-267dadbd30ba.png
docs/pics/5bb1b38a-527e-4802-a385-267dadbd30ba.png
+0
-0
docs/pics/ac929ea3-daca-40ec-9e95-4b2fa6678243.png
docs/pics/ac929ea3-daca-40ec-9e95-4b2fa6678243.png
+0
-0
notes/pics/14389ea4-8d96-4e96-9f76-564ca3324c1e.png
notes/pics/14389ea4-8d96-4e96-9f76-564ca3324c1e.png
+0
-0
notes/pics/1d28ad05-39e5-49a2-a6a1-a6f496adba6a.png
notes/pics/1d28ad05-39e5-49a2-a6a1-a6f496adba6a.png
+0
-0
notes/pics/5bb1b38a-527e-4802-a385-267dadbd30ba.png
notes/pics/5bb1b38a-527e-4802-a385-267dadbd30ba.png
+0
-0
notes/pics/ac929ea3-daca-40ec-9e95-4b2fa6678243.png
notes/pics/ac929ea3-daca-40ec-9e95-4b2fa6678243.png
+0
-0
notes/数据库系统原理.md
notes/数据库系统原理.md
+23
-28
未找到文件。
docs/notes/数据库系统原理.md
浏览文件 @
7fa78333
...
...
@@ -130,7 +130,6 @@ MySQL 中提供了两种封锁粒度:行级锁以及表级锁。
在选择封锁粒度时,需要在锁开销和并发程度之间做一个权衡。
<div
align=
"center"
>
<img
src=
"https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/1a851e90-0d5c-4d4f-ac54-34c20ecfb903.jpg"
width=
"300"
/>
</div><br>
## 封锁类型
...
...
@@ -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 是最低级别的范式。
<div
align=
"center"
>
<img
src=
"https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/c2d343f7-604c-4856-9a3c-c71d6f67fecc.png"
width=
"300"
/>
</div><br>
### 1. 第一范式 (1NF)
属性不可分。
...
...
@@ -537,7 +536,7 @@ Entity-Relationship,有三个组成部分:实体、属性、联系。
下图的 Course 和 Student 是一对多的关系。
<div
align=
"center"
>
<img
src=
"https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/
292b4a35-4507-4256-84ff-c218f108ee31.jpg"
width=
"
"
/>
</div><br>
<div
align=
"center"
>
<img
src=
"https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/
1d28ad05-39e5-49a2-a6a1-a6f496adba6a.png"
width=
"380px
"
/>
</div><br>
## 表示出现多次的关系
...
...
@@ -545,23 +544,19 @@ Entity-Relationship,有三个组成部分:实体、属性、联系。
下图表示一个课程的先修关系,先修关系出现两个 Course 实体,第一个是先修课程,后一个是后修课程,因此需要用两条线来表示这种关系。
<div
align=
"center"
>
<img
src=
"https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/
8b798007-e0fb-420c-b981-ead215692417.jpg"
width=
"
"
/>
</div><br>
<div
align=
"center"
>
<img
src=
"https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/
ac929ea3-daca-40ec-9e95-4b2fa6678243.png"
width=
"250px
"
/>
</div><br>
## 联系的多向性
虽然老师可以开设多门课,并且可以教授多名学生,但是对于特定的学生和课程,只有一个老师教授,这就构成了一个三元联系。
<div
align=
"center"
>
<img
src=
"https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/423f2a40-bee1-488e-b460-8e76c48ee560.png"
width=
""
/>
</div><br>
一般只使用二元联系,可以把多元联系转换为二元联系。
<div
align=
"center"
>
<img
src=
"https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/de9b9ea0-1327-4865-93e5-6f805c48bc9e.png"
width=
""
/>
</div><br>
<div
align=
"center"
>
<img
src=
"https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/5bb1b38a-527e-4802-a385-267dadbd30ba.png"
width=
"350px"
/>
</div><br>
## 表示子类
用一个三角形和两条线来连接类和子类,与子类有关的属性和联系都连到子类上,而与父类和子类都有关的连到父类上。
<div
align=
"center"
>
<img
src=
"https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/
7ec9d619-fa60-4a2b-95aa-bf1a62aad408.jpg"
width=
"
"
/>
</div><br>
<div
align=
"center"
>
<img
src=
"https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/
14389ea4-8d96-4e96-9f76-564ca3324c1e.png"
width=
"450px
"
/>
</div><br>
# 参考资料
...
...
docs/pics/14389ea4-8d96-4e96-9f76-564ca3324c1e.png
0 → 100644
浏览文件 @
7fa78333
22.9 KB
docs/pics/1d28ad05-39e5-49a2-a6a1-a6f496adba6a.png
0 → 100644
浏览文件 @
7fa78333
10.2 KB
docs/pics/5bb1b38a-527e-4802-a385-267dadbd30ba.png
0 → 100644
浏览文件 @
7fa78333
13.7 KB
docs/pics/ac929ea3-daca-40ec-9e95-4b2fa6678243.png
0 → 100644
浏览文件 @
7fa78333
13.9 KB
notes/pics/14389ea4-8d96-4e96-9f76-564ca3324c1e.png
0 → 100644
浏览文件 @
7fa78333
22.9 KB
notes/pics/1d28ad05-39e5-49a2-a6a1-a6f496adba6a.png
0 → 100644
浏览文件 @
7fa78333
10.2 KB
notes/pics/5bb1b38a-527e-4802-a385-267dadbd30ba.png
0 → 100644
浏览文件 @
7fa78333
13.7 KB
notes/pics/ac929ea3-daca-40ec-9e95-4b2fa6678243.png
0 → 100644
浏览文件 @
7fa78333
13.9 KB
notes/数据库系统原理.md
浏览文件 @
7fa78333
...
...
@@ -130,7 +130,6 @@ MySQL 中提供了两种封锁粒度:行级锁以及表级锁。
在选择封锁粒度时,需要在锁开销和并发程度之间做一个权衡。
<div
align=
"center"
>
<img
src=
"pics/1a851e90-0d5c-4d4f-ac54-34c20ecfb903.jpg"
width=
"300"
/>
</div><br>
## 封锁类型
...
...
@@ -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 是最低级别的范式。
<div
align=
"center"
>
<img
src=
"pics/c2d343f7-604c-4856-9a3c-c71d6f67fecc.png"
width=
"300"
/>
</div><br>
### 1. 第一范式 (1NF)
属性不可分。
...
...
@@ -537,7 +536,7 @@ Entity-Relationship,有三个组成部分:实体、属性、联系。
下图的 Course 和 Student 是一对多的关系。
<div
align=
"center"
>
<img
src=
"pics/
292b4a35-4507-4256-84ff-c218f108ee31.jpg"
width=
"
"
/>
</div><br>
<div
align=
"center"
>
<img
src=
"pics/
1d28ad05-39e5-49a2-a6a1-a6f496adba6a.png"
width=
"380px
"
/>
</div><br>
## 表示出现多次的关系
...
...
@@ -545,23 +544,19 @@ Entity-Relationship,有三个组成部分:实体、属性、联系。
下图表示一个课程的先修关系,先修关系出现两个 Course 实体,第一个是先修课程,后一个是后修课程,因此需要用两条线来表示这种关系。
<div
align=
"center"
>
<img
src=
"pics/
8b798007-e0fb-420c-b981-ead215692417.jpg"
width=
"
"
/>
</div><br>
<div
align=
"center"
>
<img
src=
"pics/
ac929ea3-daca-40ec-9e95-4b2fa6678243.png"
width=
"250px
"
/>
</div><br>
## 联系的多向性
虽然老师可以开设多门课,并且可以教授多名学生,但是对于特定的学生和课程,只有一个老师教授,这就构成了一个三元联系。
<div
align=
"center"
>
<img
src=
"pics/423f2a40-bee1-488e-b460-8e76c48ee560.png"
width=
""
/>
</div><br>
一般只使用二元联系,可以把多元联系转换为二元联系。
<div
align=
"center"
>
<img
src=
"pics/de9b9ea0-1327-4865-93e5-6f805c48bc9e.png"
width=
""
/>
</div><br>
<div
align=
"center"
>
<img
src=
"pics/5bb1b38a-527e-4802-a385-267dadbd30ba.png"
width=
"350px"
/>
</div><br>
## 表示子类
用一个三角形和两条线来连接类和子类,与子类有关的属性和联系都连到子类上,而与父类和子类都有关的连到父类上。
<div
align=
"center"
>
<img
src=
"pics/
7ec9d619-fa60-4a2b-95aa-bf1a62aad408.jpg"
width=
"
"
/>
</div><br>
<div
align=
"center"
>
<img
src=
"pics/
14389ea4-8d96-4e96-9f76-564ca3324c1e.png"
width=
"450px
"
/>
</div><br>
# 参考资料
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录