Skip to content

Commit 48efca3

Browse files
author
代码风水师
committed
更新了数据库事务的ACID特性、InnoDB讲解、MySQL锁总结
1 parent 8e080ba commit 48efca3

File tree

6 files changed

+288
-127
lines changed

6 files changed

+288
-127
lines changed

README.md

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
* [Java多线程与并发框 (第 05 篇) 深入理解:顺序一致性模型](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/multithreads/SequentialConsistencyModel.md)
4343
* [Java多线程与并发框 (第 06 篇) 深入理解:synchronized 关键字](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/multithreads/synchronized.md)
4444
* [Java多线程与并发框 (第 07 篇) 深入理解:volatile 关键字](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/multithreads/volatile.md)
45-
* [Java多线程与并发框 (第 08 篇) 深入理解:Java各种锁与无锁](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/multithreads/.md)
45+
* [Java多线程与并发框 (第 08 篇) 深入理解:Java各种锁与无锁](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/multithreads/LockAndLock-free.md)
4646
* [Java多线程与并发框 (第 09 篇) 深入理解:CAS](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/multithreads/CompareAndSwap.md)
4747
* [Java多线程与并发框 (第 10 篇) 深入理解:并发包的基石 -- 队列同步器 AQS](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/multithreads/AbstractQueuedSynchronizer.md)
4848
* [Java多线程与并发框 (第 11 篇) 深入理解:并发辅助工具类(很好的玩的工具类)](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/multithreads/ConcurrentHelperUtil.md)
@@ -59,7 +59,7 @@
5959
* [网络协议 (第 04 篇) 精讲:TCP和UPD的区别与对比](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/networking/TCPAndUDP.md)
6060
* [网络协议 (第 05 篇) 精讲:TCP三次握手与四次挥手](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/networking/TCPConnectAndDisconnect.md)
6161
* [网络协议 (第 06 篇) 精讲:滑动窗口协议](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/networking/SlidingWindowProtocol.md)
62-
* [网络协议 (第 07 篇) 精讲:一位用户从浏览器地址框输入url、按下回车键后,经历了什么](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/networking/RequestAndResponse.md)
62+
* 网络协议 (第 07 篇) 精讲:一位用户从浏览器地址框输入url、按下回车键后,经历了什么]
6363
* 网络协议 (第 08 篇) 精讲:加密
6464
* [网络协议 (第 09 篇) 精讲:IP地址的分类](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/networking/IPAddressClassification.md)
6565
* [网络协议 (第 10 篇) 精讲:常见HTTP状态码及含义](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/networking/StateCode.md)
@@ -109,25 +109,25 @@
109109
* [数据库 (第 02 篇)精讲:事务的ACID四大特性与四种隔离级别](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/database/ACIDAndIsolationLevel.md)
110110
* [数据库 (第 03 篇)精讲: MySQL InnoDB 索引](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/database/InnoDB.md)
111111
* [数据库 (第 04 篇)精讲: MySQL锁机制](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/database/MySQLLock.md)
112-
* [数据库 (第 05 篇)精讲: 悲观锁与乐观锁](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/database/PessimisticlockAndOptimisticlock.md)
113-
* [数据库 (第 06 篇)精讲: SQL优化](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/database/SQLOptimization.md)
114-
* [数据库 (第 07 篇)精讲: 数据库拆分](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/database/DBSplit.md)
112+
* [数据库 (第 05 篇)精讲: SQL优化](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/database/SQLOptimization.md)
113+
* [数据库 (第 06 篇)精讲: 数据库拆分](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/database/DBSplit.md)
115114

116115

117116
### 八、:telescope::tokyo_tower::satellite:分布式系统
118117
* [分布式系统 (第 01 篇) 精讲:集群与分布式](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/distribution/WhatisDistributed.md)
119118
* [分布式系统 (第 02 篇) 精讲:CAP定理与BASE理论](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/distribution/CAPandBASE.md)
120-
* [分布式系统 (第 03 篇) 精讲:2PC协议和3PC协议](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/distribution/2PCand3PC.md)
121-
* 分布式系统 (第 04 篇) 精讲:TCC事务补偿机制(柔性事务方案)
122-
* 分布式系统 (第 05 篇) 精讲:Paxos算法(强一致性算法)
123-
* 分布式系统 (第 06 篇) 精讲:Chubby 与 Zookeeper
124-
* 分布式系统 (第 07 篇) 精讲:设计分布式锁
125-
* 分布式系统 (第 08 篇) 精讲:分布式session/token一致性设计
126-
* 分布式系统 (第 09 篇) 精讲:分布式事务
127-
* 分布式系统 (第 10 篇) 精讲:分布式缓存
128-
* 分布式系统 (第 11 篇) 精讲:分布式高并发的支持与控制
129-
* 分布式系统 (第 12 篇) 精讲:分布式下悲观锁和乐观锁的实现
130-
* 分布式系统 (第 13 篇) 精讲:分布式支付框架的实现
119+
* [分布式系统 (第 03 篇) 精讲:XA事务](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/distribution/XA.md)
120+
* [分布式系统 (第 04 篇) 精讲:2PC协议和3PC协议](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/distribution/2PCand3PC.md)
121+
* 分布式系统 (第 05 篇) 精讲:TCC事务补偿机制(柔性事务方案)
122+
* 分布式系统 (第 06 篇) 精讲:Paxos算法(强一致性算法)
123+
* 分布式系统 (第 07 篇) 精讲:Chubby 与 Zookeeper
124+
* 分布式系统 (第 08 篇) 精讲:设计分布式锁
125+
* 分布式系统 (第 09 篇) 精讲:分布式session/token一致性设计
126+
* 分布式系统 (第 10 篇) 精讲:分布式事务
127+
* 分布式系统 (第 11 篇) 精讲:分布式缓存
128+
* 分布式系统 (第 12 篇) 精讲:分布式高并发的支持与控制
129+
* 分布式系统 (第 13 篇) 精讲:分布式下悲观锁和乐观锁的实现
130+
* 分布式系统 (第 14 篇) 精讲:分布式支付框架的实现
131131

132132

133133
### 九、:microscope::microscope::microscope:微服务

resource/markdown/database/ACIDAndIsolationLevel.md

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,27 @@
1212
>
1313
> 比如一个事务包含两个更新操作A和B,A操作更新成功,而B操作更新失败,则A操作会被回滚。绝不会出现一个成功、一个失败的场景,否则这不是一个事务。
1414
15-
#### :four_leaf_clover:一致性(Consistency )
1615

17-
> **一致性** 是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
1816

19-
常见的案例描述:
17+
#### :four_leaf_clover:一致性(Consistency )
2018

21-
> 拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性
19+
> **一致性** 是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性
2220
23-
看完上面的故事没发现啥毛病,但不能说明数据库事务的一致性问题
21+
保证数据库一致性的主要机制层面:数据库机制层面、业务层面
2422

2523

2624

2725
#### :umbrella:隔离性(Isolation )
2826

27+
每个事务都有各自的资源单位,事务与事务之间是互相隔离的、不可见的,而事务的结果是对其他事务可见的。
28+
29+
一个数据库系统中存在多个事务,每个事务中的各个子操作是对其他事务不可见的,在提交后的结果是对其他事务可见的。可以理解为资源粒子度的划分与隔离。
2930

3031

31-
#### :dart:持久性(Durability )
32+
33+
#### :memo:持久性(Durability )
34+
35+
持久性确保的是一旦提交了事务,即使出现系统故障,该事务的更新也不会丢失。我们可以宽泛的认为,将数据持久化到磁盘。
3236

3337

3438

@@ -38,30 +42,39 @@
3842
3943

4044

41-
#### 读未提交(read uncommited
45+
#### 读未提交(READ_UNCOMMITTED
4246

4347
> 就是一个事务A读取另一个事务B *未提交* 的数据。(如果如果事务B出现 **回滚**,那么事务A就会出现 ~~*脏读*~~:x: 的问题)。
4448
4549

4650

47-
48-
49-
#### 读已提交(read commited)
51+
#### 读已提交(READ_COMMITTED)
5052

5153
> 一个事务A读取另一个事务B *已提交* 的数据,那么这样可以解决 ~~`脏读`~~ 的问题。保证读取的数据 **已提交**:white_check_mark: 而不能被 ~~回滚~~:back:。在事务B提交前的 **update**,事务A是读取不到的。只有事务B提交后,事务A才能读取到事务B的 `update改动`。出现的问题是 *一个事务范围内两个相同的查询却返回了不同的数据*,那么这就是`不可重复读`
5254
5355

5456

55-
#### 可重复读(Repeatable read
57+
#### 可重复读(REPETABLE_READ
5658

5759
> 事务开启时,不再允许其他事务 ~~修改(update)~~ 数据。这样就可以无限制的读取没有被 ~~修改(update)~~ 的数据了。出现的问题是,当有 **并行插入(insert)** 操作时就会出现 **幻读**
5860
5961

6062

61-
#### 可串行化(Serializable
63+
#### 可串行化(SERIALIZABLE
6264

6365
> 在可串行化的隔离级别下,将事务 **串行化** 顺序执行。那么事务不能进行并行操作,也就解决了 ~~*幻读*~~ 的问题。
6466
6567

6668

67-
***InnoDB** 的默认事务隔离级别是:**可重复读**
69+
**总结:**
70+
71+
| 隔离级别 | 脏读 | 可重复读 | 幻读 |
72+
| ------------------ | ---- | -------- | ---- |
73+
| READ_UNCOMMITTED | 允许 | 允许 | 允许 |
74+
| READ_COMMITTED | 阻止 | 允许 | 允许 |
75+
| **REPETABLE_READ** | 阻止 | 阻止 | 允许 |
76+
| SERIALIZABLE | 阻止 | 阻止 | 阻止 |
77+
78+
79+
80+
***InnoDB** 的默认事务隔离级别是:**可重复读(REPETABLE_READ)**
Lines changed: 78 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,83 @@
1-
<h3 style="padding-bottom:6px; padding-left:20px; color:#ffffff; background-color:#E74C3C;">MySQL存储引擎</h3>
1+
<h3 style="padding-bottom:6px; padding-left:20px; color:#ffffff; background-color:#E74C3C;">InnoDB 索引</h3>
22

33

44

5-
存储引擎对比
5+
#### InnoDB特征
66

7-
| 引擎 | 存储限制 | 支持事务 | 全文索引 | 哈希索引 | 数据缓存 | 支持外键 |
8-
| ------- | -------- | :------: | :------: | :------: | :------: | :------: |
9-
| InnoDB | 64TB || :x: ||||
10-
| MyISAM | 256TB | :x: ||| :x: | :x: |
11-
| Memory | RAM | :x: | :x: || N/A | :x: |
12-
| Archive | None | :x: | :x: | :x: | :x: | :x: |
7+
* 完全的事务支持
8+
* 基于行存储的行级锁
9+
* 多版本并发控制
10+
* 原子死锁检测
11+
* 原子崩溃恢复
1312

13+
14+
15+
#### InnoDB架构
16+
17+
![InnoDB架构](https://i.loli.net/2019/01/14/5c3c064b9dcee.png)
18+
19+
#### InnoDB 逻辑存储结构
20+
21+
在InnoDB 下,所有的数据都存储在一个 **表空间(tablespace)** 中。表空间又由段(segment)、区(extent)、页(page)、行(row)组成。页在一些文档中有时也称为块(block),1 extent = 64 pages,InnoDB存储引擎的逻辑存储结构大致如图所示。
22+
23+
![InnoDB表结构](https://images2015.cnblogs.com/blog/990532/201701/990532-20170116094754739-1789768872.png)
24+
25+
26+
27+
#### B-tree
28+
29+
定义:
30+
31+
B树(B-TREE)满足如下条件,即可称之为m阶B树:
32+
33+
- 每个结点最多拥有m棵子树;
34+
- 根结点最少拥有2颗子树(存在子树的情况下);
35+
- 除了根结点以外,其余每个分支结点至少拥有 m/2 棵子树;
36+
- 所有的叶结点都在同一层上;
37+
- 有 k 棵子树的分支结点则存在 k-1 个关键码,关键码按照递增次序进行排列;
38+
- 关键字数量需要满足ceil(m/2)-1 <= n <= m-1;
39+
40+
![B-tree](https://i.loli.net/2019/01/14/5c3c2564e867a.png)
41+
42+
B-tree的特点是每个结点不仅存放键值,而且存放数据。
43+
44+
---
45+
46+
#### B+tree
47+
48+
![B+tree](https://i.loli.net/2019/01/14/5c3c24d11402a.png)
49+
50+
51+
52+
**B+树特点:**
53+
54+
* 所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
55+
* 所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。
56+
57+
58+
59+
**B+树的优点:**
60+
61+
* 单一节点存储更多的元素(因为不含有对应的值,仅仅含有键),使得查询的IO次数更少。
62+
* 所有查询都要从根节点查找到叶子节点,查询性能稳定,相对于B树更加稳定,以为B+树只有叶子节点存储了对应的值信息。
63+
* 所有叶子节点形成有序双向链表,对于SQL的范围查询以及排序查询都很方便。
64+
* B/B+树的共同优点的每个节点有更多的孩子,插入不需要改变树的高度,从而减少重新平衡的次数,非常适合做数据库索引这种需要持久化在磁盘,同时需要大量查询和插入的应用。树中节点存储这指向页的信息,可以快速定位到磁盘对应的页上面。
65+
66+
67+
68+
#### 存储引擎对比
69+
70+
| 引擎 | 存储限制 | 支持事务 | 全文索引 | 哈希索引 | 数据缓存 | 支持外键 |
71+
| ---------- | -------- | :------: | :------: | :------: | :------: | :------: |
72+
| **InnoDB** | 64TB || :x: ||||
73+
| **MyISAM** | 256TB | :x: ||| :x: | :x: |
74+
| Memory | RAM | :x: | :x: || N/A | :x: |
75+
| Archive | None | :x: | :x: | :x: | :x: | :x: |
76+
77+
78+
79+
参考资料:
80+
81+
[InnoDB 存储引擎原理解析](https://zhuanlan.zhihu.com/p/35925589)
82+
83+
[InnoDB索引最通俗的解释](https://blog.csdn.net/u010710458/article/details/80209909)

0 commit comments

Comments
 (0)