auto commit
This commit is contained in:
parent
9fe258cc2b
commit
93e927f125
|
@ -92,7 +92,7 @@ T<sub>1</sub> 读入某个数据,T<sub>2</sub> 对该数据做了修改,如
|
||||||
|
|
||||||
## 2. 提交读(READ COMMITTED)
|
## 2. 提交读(READ COMMITTED)
|
||||||
|
|
||||||
一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务所在的修改在提交之前对其它事务使不可见的。这个级别有时候也叫做不可重复读,因为两次执行同样的查询,可能会得到不一样的结果。
|
一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务所在的修改在提交之前对其它事务是不可见的。这个级别有时候也叫做不可重复读,因为两次执行同样的查询,可能会得到不一样的结果。
|
||||||
|
|
||||||
## 3. 可重复读(REPEATABLE READ)
|
## 3. 可重复读(REPEATABLE READ)
|
||||||
|
|
||||||
|
@ -112,18 +112,17 @@ T<sub>1</sub> 读入某个数据,T<sub>2</sub> 对该数据做了修改,如
|
||||||
|
|
||||||
排它锁 (X 锁)和共享锁 (S 锁),又称写锁和读锁。
|
排它锁 (X 锁)和共享锁 (S 锁),又称写锁和读锁。
|
||||||
|
|
||||||
- 一个事务对数据对象 A 加了 X 锁,就可以对 A 进行读取和更新。加锁期间其它事务不能对 A 加任何其它锁;
|
- 一个事务对数据对象 A 加了 X 锁,就可以对 A 进行读取和更新。加锁期间其它事务不能对 A 加任何锁;
|
||||||
|
|
||||||
- 一个事务对数据对象 A 加了 S 锁,可以对 A 进行读取操作,但是不能进行更新操作。加锁期间其它事务能对 A 加 S 锁,但是不能加 X 锁。
|
- 一个事务对数据对象 A 加了 S 锁,可以对 A 进行读取操作,但是不能进行更新操作。加锁期间其它事务能对 A 加 S 锁,但是不能加 X 锁。
|
||||||
|
|
||||||
|
|
||||||
# 封锁粒度
|
# 封锁粒度
|
||||||
|
|
||||||
应该尽量只锁定需要修改的部分数据,而不是所有的资源。锁定的数据量越少,发生锁争用的可能就更小,则系统的并发程度越高。
|
应该尽量只锁定需要修改的那部分数据,而不是所有的资源。锁定的数据量越少,发生锁争用的可能就越小,系统的并发程度就越高。
|
||||||
|
|
||||||
但是加锁需要消耗资源,锁的各种操作,包括获取锁,检查所是否已经解除、释放锁,都会增加系统开销。因此需要在锁开销以及数据安全性之间做一个权衡。
|
但是加锁需要消耗资源,锁的各种操作,包括获取锁,检查所是否已经解除、释放锁,都会增加系统开销。因此封锁粒度越小,系统开销就越大。需要在锁开销以及数据安全性之间做一个权衡。
|
||||||
|
|
||||||
MySQL 中主要提供了两种锁粒度:行解锁以及表级锁。
|
MySQL 中主要提供了两种封锁粒度:行级锁以及表级锁。
|
||||||
|
|
||||||
# 封锁协议
|
# 封锁协议
|
||||||
|
|
||||||
|
@ -131,21 +130,21 @@ MySQL 中主要提供了两种锁粒度:行解锁以及表级锁。
|
||||||
|
|
||||||
<div align="center"> <img src="../pics//785806ed-c46b-4dca-b756-cebe7bf8ac3a.jpg"/> </div><br>
|
<div align="center"> <img src="../pics//785806ed-c46b-4dca-b756-cebe7bf8ac3a.jpg"/> </div><br>
|
||||||
|
|
||||||
**1 级封锁协议**
|
**一级封锁协议**
|
||||||
|
|
||||||
事务 T 要修改数据 A 时必须加 X 锁,直到事务结束才释放锁。
|
事务 T 要修改数据 A 时必须加 X 锁,直到事务结束才释放锁。
|
||||||
|
|
||||||
可以解决丢失修改问题;
|
可以解决丢失修改问题;
|
||||||
|
|
||||||
**2 级封锁协议**
|
**二级封锁协议**
|
||||||
|
|
||||||
在 1 级的基础上,要求读取数据 A 时必须加 S 锁,读取完马上释放 S 锁。
|
在一级的基础上,要求读取数据 A 时必须加 S 锁,读取完马上释放 S 锁。
|
||||||
|
|
||||||
可以解决读脏数据问题,因为如果一个事务在对数据 A 进行修改,根据 1 级封锁协议,会加 X 锁,那么就不能再加 S 锁了,也就是不会读入数据。
|
可以解决读脏数据问题,因为如果一个事务在对数据 A 进行修改,根据 1 级封锁协议,会加 X 锁,那么就不能再加 S 锁了,也就是不会读入数据。
|
||||||
|
|
||||||
**3 级封锁协议**
|
**三级封锁协议**
|
||||||
|
|
||||||
在 2 级的基础上,要求读取数据 A 时必须加 S 锁,直到事务结束了才能释放 S 锁。
|
在二级的基础上,要求读取数据 A 时必须加 S 锁,直到事务结束了才能释放 S 锁。
|
||||||
|
|
||||||
可以解决不可重复读的问题,因为读 A 时,其它事务不能对 A 加 X 锁,从而避免了在读的期间数据发生改变。
|
可以解决不可重复读的问题,因为读 A 时,其它事务不能对 A 加 X 锁,从而避免了在读的期间数据发生改变。
|
||||||
|
|
||||||
|
@ -188,9 +187,9 @@ MySQL InnoDB 采用的是两阶段锁协议。在事务执行过程中,随时
|
||||||
|
|
||||||
如果 {A1,A2,... ,An} 是关系的一个或多个属性的集合,该集合决定了关系的其它所有属性并且是最小的,那么该集合就称为键码。
|
如果 {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}。
|
||||||
|
|
||||||
<div align="center"> <img src="../pics//b6a678c0-c875-4038-afba-301846620786.jpg"/> </div><br>
|
<div align="center"> <img src="../pics//b6a678c0-c875-4038-afba-301846620786.jpg"/> </div><br>
|
||||||
|
|
||||||
|
@ -219,21 +218,21 @@ MySQL InnoDB 采用的是两阶段锁协议。在事务执行过程中,随时
|
||||||
|
|
||||||
<div align="center"><img src="https://latex.codecogs.com/gif.latex?S(Sno,Cname,Sname,Sdept,Mname)"/></div> <br>
|
<div align="center"><img src="https://latex.codecogs.com/gif.latex?S(Sno,Cname,Sname,Sdept,Mname)"/></div> <br>
|
||||||
|
|
||||||
<div align="center"><img src="https://latex.codecogs.com/gif.latex?(Sno,Cname)->(Sname,Sdept,Mname)"/></div> <br>
|
<div align="center"><img src="https://latex.codecogs.com/gif.latex?Sno,Cname->Sname,Sdept,Mname"/></div> <br>
|
||||||
|
|
||||||
**分解后**
|
**分解后**
|
||||||
|
|
||||||
<div align="center"><img src="https://latex.codecogs.com/gif.latex?S1(Sno,Sname,Sdept,Mname)"/></div> <br>
|
<div align="center"><img src="https://latex.codecogs.com/gif.latex?S1(Sno,Sname,Sdept,Mname)"/></div> <br>
|
||||||
|
|
||||||
<div align="center"><img src="https://latex.codecogs.com/gif.latex?(Sno)->(Sname,Sdept,Mname)"/></div> <br>
|
<div align="center"><img src="https://latex.codecogs.com/gif.latex?Sno->Sname,Sdept,Mname"/></div> <br>
|
||||||
|
|
||||||
<div align="center"><img src="https://latex.codecogs.com/gif.latex?(Sdept)->(Mname)"/></div> <br>
|
<div align="center"><img src="https://latex.codecogs.com/gif.latex?Sdept->Mname"/></div> <br>
|
||||||
|
|
||||||
<div align="center"> <img src="../pics//8ef22836-8800-4765-b4b8-ade80096b323.jpg"/> </div><br>
|
<div align="center"> <img src="../pics//8ef22836-8800-4765-b4b8-ade80096b323.jpg"/> </div><br>
|
||||||
|
|
||||||
<div align="center"><img src="https://latex.codecogs.com/gif.latex?S2(Sno,Cname,Grade)"/></div> <br>
|
<div align="center"><img src="https://latex.codecogs.com/gif.latex?S2(Sno,Cname,Grade)"/></div> <br>
|
||||||
|
|
||||||
<div align="center"><img src="https://latex.codecogs.com/gif.latex?(Sno,Cname)->(Grade)"/></div> <br>
|
<div align="center"><img src="https://latex.codecogs.com/gif.latex?Sno,Cname->Grade"/></div> <br>
|
||||||
|
|
||||||
<div align="center"> <img src="../pics//b0748916-1acd-4138-b24c-69326cb452fe.jpg"/> </div><br>
|
<div align="center"> <img src="../pics//b0748916-1acd-4138-b24c-69326cb452fe.jpg"/> </div><br>
|
||||||
|
|
||||||
|
@ -251,15 +250,15 @@ MySQL InnoDB 采用的是两阶段锁协议。在事务执行过程中,随时
|
||||||
|
|
||||||
关系模式 STC(Sname, Tname, Cname, Grade),其中四个属性分别为学生姓名、教师姓名、课程名和成绩。有以下函数依赖:
|
关系模式 STC(Sname, Tname, Cname, Grade),其中四个属性分别为学生姓名、教师姓名、课程名和成绩。有以下函数依赖:
|
||||||
|
|
||||||
<div align="center"><img src="https://latex.codecogs.com/gif.latex?(Sname,Cname)->(Tname)"/></div> <br>
|
<div align="center"><img src="https://latex.codecogs.com/gif.latex?Sname,Cname->Tname"/></div> <br>
|
||||||
|
|
||||||
<div align="center"><img src="https://latex.codecogs.com/gif.latex?(Sname,Cname)->(Grade)"/></div> <br>
|
<div align="center"><img src="https://latex.codecogs.com/gif.latex?Sname,Cname->Grade"/></div> <br>
|
||||||
|
|
||||||
<div align="center"><img src="https://latex.codecogs.com/gif.latex?(Sname,Tname)->(Cname)"/></div> <br>
|
<div align="center"><img src="https://latex.codecogs.com/gif.latex?Sname,Tname->Cname"/></div> <br>
|
||||||
|
|
||||||
<div align="center"><img src="https://latex.codecogs.com/gif.latex?(Sname,Tname)->(Grade)"/></div> <br>
|
<div align="center"><img src="https://latex.codecogs.com/gif.latex?Sname,Tname->Grade"/></div> <br>
|
||||||
|
|
||||||
<div align="center"><img src="https://latex.codecogs.com/gif.latex?(Tname)->(Cname)"/></div> <br>
|
<div align="center"><img src="https://latex.codecogs.com/gif.latex?Tname->Cname"/></div> <br>
|
||||||
|
|
||||||
分解成 SC(Sname, Cname, Grade) 和 ST(Sname, Tname),对于 ST,属性之间是多对多关系,无函数依赖。
|
分解成 SC(Sname, Cname, Grade) 和 ST(Sname, Tname),对于 ST,属性之间是多对多关系,无函数依赖。
|
||||||
|
|
||||||
|
@ -267,7 +266,9 @@ MySQL InnoDB 采用的是两阶段锁协议。在事务执行过程中,随时
|
||||||
|
|
||||||
## 键码
|
## 键码
|
||||||
|
|
||||||
用于唯一表示一个实体。键码可以由多个属性构成,每个构成键码的属性成为码。
|
用于唯一表示一个实体。
|
||||||
|
|
||||||
|
键码可以由多个属性构成,每个构成键码的属性称为码。
|
||||||
|
|
||||||
## 单值约束
|
## 单值约束
|
||||||
|
|
||||||
|
@ -293,11 +294,13 @@ MySQL InnoDB 采用的是两阶段锁协议。在事务执行过程中,随时
|
||||||
|
|
||||||
## 外模式
|
## 外模式
|
||||||
|
|
||||||
又称用户模式,是用户和数据库系统的接口,特定的用户只能访问数据库系统提供给他的外模式中的数据。例如不同的用户创建了不同数据库,那么一个用户只能访问他有权限访问的数据库。一个数据库可以有多个外模式,一个用户只能有一个外模式,但是一个外模式可以给多个用户使用。
|
又称用户模式,是用户和数据库系统的接口,特定的用户只能访问数据库系统提供给他的外模式中的数据。例如不同的用户创建了不同数据库,那么一个用户只能访问他有权限访问的数据库。
|
||||||
|
|
||||||
|
一个数据库可以有多个外模式,一个用户只能有一个外模式,但是一个外模式可以给多个用户使用。
|
||||||
|
|
||||||
## 模式
|
## 模式
|
||||||
|
|
||||||
可以分为概念模式和逻辑模式,概念模式可以用概念 - 关系来描述;逻辑模式使用特定的数据模式(比如关系模型)来描述数据的逻辑结构,这种逻辑结构包括数据的组成、数据项的名称、类型、取值范围。不仅如此,逻辑模式还要描述数据之间的关系,数据的完整性与安全性要求。
|
可以分为概念模式和逻辑模式,概念模式可以用概念-关系来描述;逻辑模式使用特定的数据模式(比如关系模型)来描述数据的逻辑结构,这种逻辑结构包括数据的组成、数据项的名称、类型、取值范围。不仅如此,逻辑模式还要描述数据之间的关系,数据的完整性与安全性要求。
|
||||||
|
|
||||||
## 内模式
|
## 内模式
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user