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 采用的是两阶段锁协议。在事务执行过程中,随时 ## 外模式 -又称用户模式,是用户和数据库系统的接口,特定的用户只能访问数据库系统提供给他的外模式中的数据。例如不同的用户创建了不同数据库,那么一个用户只能访问他有权限访问的数据库。一个数据库可以有多个外模式,一个用户只能有一个外模式,但是一个外模式可以给多个用户使用。 +又称用户模式,是用户和数据库系统的接口,特定的用户只能访问数据库系统提供给他的外模式中的数据。例如不同的用户创建了不同数据库,那么一个用户只能访问他有权限访问的数据库。 + +一个数据库可以有多个外模式,一个用户只能有一个外模式,但是一个外模式可以给多个用户使用。 ## 模式 -可以分为概念模式和逻辑模式,概念模式可以用概念 - 关系来描述;逻辑模式使用特定的数据模式(比如关系模型)来描述数据的逻辑结构,这种逻辑结构包括数据的组成、数据项的名称、类型、取值范围。不仅如此,逻辑模式还要描述数据之间的关系,数据的完整性与安全性要求。 +可以分为概念模式和逻辑模式,概念模式可以用概念-关系来描述;逻辑模式使用特定的数据模式(比如关系模型)来描述数据的逻辑结构,这种逻辑结构包括数据的组成、数据项的名称、类型、取值范围。不仅如此,逻辑模式还要描述数据之间的关系,数据的完整性与安全性要求。 ## 内模式