Skip to content

Commit 49dbf54

Browse files
committed
Java
1 parent b6da6d9 commit 49dbf54

25 files changed

Lines changed: 535 additions & 34 deletions

docs/1_计算机基础.md

Lines changed: 0 additions & 21 deletions
This file was deleted.

docs/5_数据库.md

Whitespace-only changes.

docs/6_常用框架.md

Whitespace-only changes.

docs/7_消息队列.md

Whitespace-only changes.

docs/8_网站架构.md

Whitespace-only changes.

docs/9_工具.md

Whitespace-only changes.
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
# 数据库系统原理
2+
3+
## 事务
4+
5+
### 概念
6+
7+
事务是**逻辑上的一组操作**,要么都执行,要么都不执行。
8+
9+
### 特性 ACID
10+
11+
#### 1. 原子性(Atomicity)
12+
13+
事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。
14+
15+
回滚可以用日志来实现,日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可。
16+
17+
#### 2. 一致性(Consistency)
18+
19+
数据库在事务执行前后都保持一致性状态。在一致性状态下,所有事务对一个数据的读取结果都是相同的。
20+
21+
#### 3. 隔离性(Isolation)
22+
23+
一个事务所做的修改在最终提交以前,对其它事务是不可见的。
24+
25+
#### 4. 持久性(Durability)
26+
27+
一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。
28+
29+
可以通过数据库备份和恢复来实现,在系统发生崩溃时,使用备份的数据库进行数据恢复。
30+
31+
32+
33+
## 并发一致性问题
34+
35+
在并发环境下,事务的隔离性很难保证,因此会出现很多并发一致性问题。
36+
37+
### 丢失修改
38+
39+
T1 和 T2 两个事务都对一个数据进行修改,T1 先修改,T2 随后修改,T2 的修改覆盖了 T1 的修改。
40+
41+
<div align="center"><img src="https://gitee.com/duhouan/ImagePro/raw/master/java-notes/database/88ff46b3-028a-4dbb-a572-1f062b8b96d3.png" width="350px"></div>
42+
43+
### 脏读
44+
45+
T1 修改一个数据,T2 随后读取这个数据。如果 T1 撤销了这次修改,那么 T2 读取的数据是脏数据。
46+
47+
<div align="center"><img src="https://gitee.com/duhouan/ImagePro/raw/master/java-notes/database/dd782132-d830-4c55-9884-cfac0a541b8e.png" width="350px"></div>
48+
49+
### 不可重复读
50+
51+
T2 读取一个数据,T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。
52+
53+
<div align="center"><img src="https://gitee.com/duhouan/ImagePro/raw/master/java-notes/database/c8d18ca9-0b09-441a-9a0c-fb063630d708.png" width="350px"></div>
54+
55+
### 幻影读
56+
57+
T1 读取某个**范围**的数据,T2 在这个**范围**内插入新的数据,T1 再次读取这个**范围**的数据,此时读取的结果和和第一次读取的结果不同。
58+
59+
<div align="center"><img src="https://gitee.com/duhouan/ImagePro/raw/master/java-notes/database/72fe492e-f1cb-4cfc-92f8-412fb3ae6fec.png" width="350px"></div>
60+
61+
## 事务隔离级别
62+
63+
产生并发不一致性问题主要原因是破坏了事务的**隔离性**,解决方法是通过**并发控制**来保证隔离性。并发控制可以通过封锁(加锁)来实现,但是封锁操作需要用户自己控制,相当复杂。数据库管理系统提供了事务的**隔离级别**,让用户以一种更轻松的方式处理并发一致性问题。
64+
65+
事务隔离级别如下:
66+
67+
| 隔离级别 | 说明 |
68+
| :--------------------------: | :------------------------------------------------: |
69+
| 未提交读(READ UNCOMMITTED) | 事务中的修改,即使没有提交,对其它事务也是可见的。 |
70+
| 提交读(READ COMMITTED) | 一个事务只能读取已经提交的事务所做的修改。 |
71+
| 可重复读(REPEATABLE READ) | 保证在同一个事务中多次读取同样数据的结果是一样的。 |
72+
| 可串行化(SERIALIZABLE) | 强制事务串行执行。 |
73+
74+
事务并发访问引起的问题及使用哪种事务隔离级别避免:
75+
76+
| 并发访问问题 | 事务隔离级别 |
77+
| :----------: | :------------------------------------------: |
78+
| 丢失修改 | MySQL 所有事务隔离级别在数据库层面上均可避免 |
79+
| 脏读 | READ-COMMITTED 事务隔离级别以上可避免 |
80+
| 不可重复读 | REPEATABLE-READ 事务隔离级别以上可避免 |
81+
| 幻读 | SERIALIZABLE 事务隔离级别以上可避免 |
82+
83+
即:
84+
85+
| 事务隔离级别 \ 并发问题 | 丢失修改 | 脏读 | 不可重复读 | 幻读 |
86+
| :---------------------------: | :------: | :--: | :--------: | :--: |
87+
| 未提交读 (READ UNCOMMITTED) | 避免 | 发生 | 发生 | 发生 |
88+
| 提交读 (READ COMMITTED) | 避免 | 避免 | 发生 | 发生 |
89+
| 可重复读 (REPEATABLE READ) | 避免 | 避免 | 避免 | 发生 |
90+
| 可串行化 (SERIALIZABLE) | 避免 | 避免 | 避免 | 避免 |
91+

docs/DataBase/2_1000行MySQL命令.md

Whitespace-only changes.
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
# 关系数据库设计理论
2+
3+
## 函数依赖
4+
5+
记 A->B 表示 A 函数决定 B,也可以说 B 函数依赖于 A。
6+
7+
如果 {A1,A2,... ,An} 是关系的一个或多个属性的集合,该集合函数决定了关系的其它所有属性并且是最小的,那么该集合就称为键码。
8+
9+
对于 A->B,如果能找到 A 的真子集 A',使得 A'-> B,那么 A->B 就是部分函数依赖,否则就是完全函数依赖。
10+
11+
对于 A->B,B->C,则 A->C 是一个传递函数依赖。
12+
13+
## 异常
14+
15+
以下的学生课程关系的函数依赖为 Sno, Cname -> Sname, Sdept, Mname, Grade,键码为 {Sno, Cname}。也就是说,确定学生和课程之后,就能确定其它信息。
16+
17+
| Sno | Sname | Sdept | Mname | Cname | Grade |
18+
| ---- | ------ | ------ | ------ | ------ | ----- |
19+
| 1 | 学生-1 | 学院-1 | 院长-1 | 课程-1 | 90 |
20+
| 2 | 学生-2 | 学院-2 | 院长-2 | 课程-2 | 80 |
21+
| 2 | 学生-2 | 学院-2 | 院长-2 | 课程-1 | 100 |
22+
| 3 | 学生-3 | 学院-2 | 院长-2 | 课程-2 | 95 |
23+
24+
不符合范式的关系,会产生很多异常,主要有以下四种异常:
25+
26+
- 冗余数据:例如 `学生-2` 出现了两次。
27+
- 修改异常:修改了一个记录中的信息,但是另一个记录中相同的信息却没有被修改。
28+
- 删除异常:删除一个信息,那么也会丢失其它信息。例如删除了 `课程-1` 需要删除第一行和第三行,那么 `学生-1` 的信息就会丢失。
29+
- 插入异常:例如想要插入一个学生的信息,如果这个学生还没选课,那么就无法插入。
30+
31+
## 范式
32+
33+
范式理论是为了解决以上提到四种异常。
34+
35+
高级别范式的依赖于低级别的范式,1NF 是最低级别的范式。
36+
37+
<div align="center"><img src="https://gitee.com/duhouan/ImagePro/raw/master/java-notes/database/c2d343f7-604c-4856-9a3c-c71d6f67fecc.png" width="400px"/></div>
38+
39+
40+
41+
### 1. 第一范式 (1NF)
42+
43+
属性不可分。
44+
45+
### 2. 第二范式 (2NF)
46+
47+
每个非主属性完全函数依赖于键码。
48+
49+
(一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的部分。)
50+
51+
可以通过分解来满足。
52+
53+
**分解前**
54+
55+
| Sno | Sname | Sdept | Mname | Cname | Grade |
56+
| ---- | ------ | ------ | ------ | ------ | ----- |
57+
| 1 | 学生-1 | 学院-1 | 院长-1 | 课程-1 | 90 |
58+
| 2 | 学生-2 | 学院-2 | 院长-2 | 课程-2 | 80 |
59+
| 2 | 学生-2 | 学院-2 | 院长-2 | 课程-1 | 100 |
60+
| 3 | 学生-3 | 学院-2 | 院长-2 | 课程-2 | 95 |
61+
62+
以上学生课程关系中,{Sno, Cname} 为键码,有如下函数依赖:
63+
64+
- Sno -> Sname, Sdept
65+
- Sdept -> Mname
66+
- Sno, Cname-> Grade
67+
68+
Grade 完全函数依赖于键码,它没有任何冗余数据,每个学生的每门课都有特定的成绩。
69+
70+
Sname, Sdept 和 Mname 都部分依赖于键码,当一个学生选修了多门课时,这些数据就会出现多次,造成大量冗余数据。
71+
72+
**分解后**
73+
74+
关系-1
75+
76+
| Sno | Sname | Sdept | Mname |
77+
| ---- | ------ | ------ | ------ |
78+
| 1 | 学生-1 | 学院-1 | 院长-1 |
79+
| 2 | 学生-2 | 学院-2 | 院长-2 |
80+
| 3 | 学生-3 | 学院-2 | 院长-2 |
81+
82+
有以下函数依赖:
83+
84+
- Sno -> Sname, Sdept
85+
- Sdept -> Mname
86+
87+
关系-2
88+
89+
| Sno | Cname | Grade |
90+
| ---- | ------ | ----- |
91+
| 1 | 课程-1 | 90 |
92+
| 2 | 课程-2 | 80 |
93+
| 2 | 课程-1 | 100 |
94+
| 3 | 课程-2 | 95 |
95+
96+
有以下函数依赖:
97+
98+
- Sno, Cname -> Grade
99+
100+
### 3. 第三范式 (3NF)
101+
102+
非主属性不传递函数依赖于键码。
103+
104+
(确保每列都和主键列直接相关,而不是间接相关。)
105+
106+
上面的 关系-1 中存在以下传递函数依赖:
107+
108+
- Sno -> Sdept -> Mname
109+
110+
可以进行以下分解:
111+
112+
关系-11
113+
114+
| Sno | Sname | Sdept |
115+
| ---- | ------ | ------ |
116+
| 1 | 学生-1 | 学院-1 |
117+
| 2 | 学生-2 | 学院-2 |
118+
| 3 | 学生-3 | 学院-2 |
119+
120+
关系-12
121+
122+
| Sdept | Mname |
123+
| ------ | ------ |
124+
| 学院-1 | 院长-1 |
125+
| 学院-2 | 院长-2 |

docs/DataBase/3_LeetCode_Database题解.md

Whitespace-only changes.

0 commit comments

Comments
 (0)