From 93e927f12563d13ae948a74d94dbcf25e2f093d2 Mon Sep 17 00:00:00 2001
From: CyC2018 <1029579233@qq.com>
Date: Wed, 14 Mar 2018 16:39:37 +0800
Subject: [PATCH] auto commit
---
notes/数据库系统原理.md | 53 ++++++++++++++++++++++-------------------
1 file changed, 28 insertions(+), 25 deletions(-)
diff --git a/notes/数据库系统原理.md b/notes/数据库系统原理.md
index 407cec94..6cb2169f 100644
--- a/notes/数据库系统原理.md
+++ b/notes/数据库系统原理.md
@@ -92,7 +92,7 @@ T1 读入某个数据,T2 对该数据做了修改,如
## 2. 提交读(READ COMMITTED)
-一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务所在的修改在提交之前对其它事务使不可见的。这个级别有时候也叫做不可重复读,因为两次执行同样的查询,可能会得到不一样的结果。
+一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务所在的修改在提交之前对其它事务是不可见的。这个级别有时候也叫做不可重复读,因为两次执行同样的查询,可能会得到不一样的结果。
## 3. 可重复读(REPEATABLE READ)
@@ -112,18 +112,17 @@ T1 读入某个数据,T2 对该数据做了修改,如
排它锁 (X 锁)和共享锁 (S 锁),又称写锁和读锁。
-- 一个事务对数据对象 A 加了 X 锁,就可以对 A 进行读取和更新。加锁期间其它事务不能对 A 加任何其它锁;
+- 一个事务对数据对象 A 加了 X 锁,就可以对 A 进行读取和更新。加锁期间其它事务不能对 A 加任何锁;
- 一个事务对数据对象 A 加了 S 锁,可以对 A 进行读取操作,但是不能进行更新操作。加锁期间其它事务能对 A 加 S 锁,但是不能加 X 锁。
-
# 封锁粒度
-应该尽量只锁定需要修改的部分数据,而不是所有的资源。锁定的数据量越少,发生锁争用的可能就更小,则系统的并发程度越高。
+应该尽量只锁定需要修改的那部分数据,而不是所有的资源。锁定的数据量越少,发生锁争用的可能就越小,系统的并发程度就越高。
-但是加锁需要消耗资源,锁的各种操作,包括获取锁,检查所是否已经解除、释放锁,都会增加系统开销。因此需要在锁开销以及数据安全性之间做一个权衡。
+但是加锁需要消耗资源,锁的各种操作,包括获取锁,检查所是否已经解除、释放锁,都会增加系统开销。因此封锁粒度越小,系统开销就越大。需要在锁开销以及数据安全性之间做一个权衡。
-MySQL 中主要提供了两种锁粒度:行解锁以及表级锁。
+MySQL 中主要提供了两种封锁粒度:行级锁以及表级锁。
# 封锁协议
@@ -131,21 +130,21 @@ MySQL 中主要提供了两种锁粒度:行解锁以及表级锁。
-**1 级封锁协议**
+**一级封锁协议**
事务 T 要修改数据 A 时必须加 X 锁,直到事务结束才释放锁。
可以解决丢失修改问题;
-**2 级封锁协议**
+**二级封锁协议**
-在 1 级的基础上,要求读取数据 A 时必须加 S 锁,读取完马上释放 S 锁。
+在一级的基础上,要求读取数据 A 时必须加 S 锁,读取完马上释放 S 锁。
可以解决读脏数据问题,因为如果一个事务在对数据 A 进行修改,根据 1 级封锁协议,会加 X 锁,那么就不能再加 S 锁了,也就是不会读入数据。
-**3 级封锁协议**
+**三级封锁协议**
-在 2 级的基础上,要求读取数据 A 时必须加 S 锁,直到事务结束了才能释放 S 锁。
+在二级的基础上,要求读取数据 A 时必须加 S 锁,直到事务结束了才能释放 S 锁。
可以解决不可重复读的问题,因为读 A 时,其它事务不能对 A 加 X 锁,从而避免了在读的期间数据发生改变。
@@ -188,9 +187,9 @@ MySQL InnoDB 采用的是两阶段锁协议。在事务执行过程中,随时
如果 {A1,A2,... ,An} 是关系的一个或多个属性的集合,该集合决定了关系的其它所有属性并且是最小的,那么该集合就称为键码。
-对于函数依赖 W->A,如果能找到 W 的真子集使得 A 依赖于这个真子集,那么就是部分依赖,否则就是完全依赖;
+对于 W->A,如果能找到 W 的真子集 W',使得 W'-> A,那么 W->A 就是部分函数依赖,否则就是完全函数依赖;
-以下关系中,Sno 表示学号,Sname 表示学生姓名,Sdept 表示学院,Cname 表示课程名,Mname 表示院长姓名。函数依赖为 (Sno, Cname) -> (Sname, Sdept, Mname)。注:实际开发过程中,不会出现这种表,而是每个实体都放在单独一张表中,然后实体之间的联系表用实体 id 来表示。
+以下关系中,Sno 表示学号,Sname 表示学生姓名,Sdept 表示学院,Cname 表示课程名,Mname 表示院长姓名。函数依赖为 {Sno, Cname} -> {Sname, Sdept, Mname}。
@@ -219,21 +218,21 @@ MySQL InnoDB 采用的是两阶段锁协议。在事务执行过程中,随时
-
+
**分解后**
-
+
-
+
-
+
@@ -251,15 +250,15 @@ MySQL InnoDB 采用的是两阶段锁协议。在事务执行过程中,随时
关系模式 STC(Sname, Tname, Cname, Grade),其中四个属性分别为学生姓名、教师姓名、课程名和成绩。有以下函数依赖:
-
+
-
+
-
+
-
+
-
+
分解成 SC(Sname, Cname, Grade) 和 ST(Sname, Tname),对于 ST,属性之间是多对多关系,无函数依赖。
@@ -267,7 +266,9 @@ MySQL InnoDB 采用的是两阶段锁协议。在事务执行过程中,随时
## 键码
-用于唯一表示一个实体。键码可以由多个属性构成,每个构成键码的属性成为码。
+用于唯一表示一个实体。
+
+键码可以由多个属性构成,每个构成键码的属性称为码。
## 单值约束
@@ -293,11 +294,13 @@ MySQL InnoDB 采用的是两阶段锁协议。在事务执行过程中,随时
## 外模式
-又称用户模式,是用户和数据库系统的接口,特定的用户只能访问数据库系统提供给他的外模式中的数据。例如不同的用户创建了不同数据库,那么一个用户只能访问他有权限访问的数据库。一个数据库可以有多个外模式,一个用户只能有一个外模式,但是一个外模式可以给多个用户使用。
+又称用户模式,是用户和数据库系统的接口,特定的用户只能访问数据库系统提供给他的外模式中的数据。例如不同的用户创建了不同数据库,那么一个用户只能访问他有权限访问的数据库。
+
+一个数据库可以有多个外模式,一个用户只能有一个外模式,但是一个外模式可以给多个用户使用。
## 模式
-可以分为概念模式和逻辑模式,概念模式可以用概念 - 关系来描述;逻辑模式使用特定的数据模式(比如关系模型)来描述数据的逻辑结构,这种逻辑结构包括数据的组成、数据项的名称、类型、取值范围。不仅如此,逻辑模式还要描述数据之间的关系,数据的完整性与安全性要求。
+可以分为概念模式和逻辑模式,概念模式可以用概念-关系来描述;逻辑模式使用特定的数据模式(比如关系模型)来描述数据的逻辑结构,这种逻辑结构包括数据的组成、数据项的名称、类型、取值范围。不仅如此,逻辑模式还要描述数据之间的关系,数据的完整性与安全性要求。
## 内模式