Skip to content

Commit d240ddc

Browse files
committed
📖backtrack
1 parent e303289 commit d240ddc

File tree

198 files changed

+11249
-9777
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

198 files changed

+11249
-9777
lines changed

docs/.DS_Store

0 Bytes
Binary file not shown.

docs/.obsidian/workspace.json

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
"state": {
5050
"type": "markdown",
5151
"state": {
52-
"file": "data-structure-algorithms/data-structure/Binary-Tree.md",
52+
"file": "data-management/Redis/Redis-Database.md",
5353
"mode": "preview",
5454
"source": false
5555
}
@@ -142,7 +142,7 @@
142142
"state": {
143143
"type": "backlink",
144144
"state": {
145-
"file": "data-structure-algorithms/data-structure/Binary-Tree.md",
145+
"file": "data-management/Redis/Redis-Database.md",
146146
"collapseAll": false,
147147
"extraContext": false,
148148
"sortOrder": "alphabetical",
@@ -159,7 +159,7 @@
159159
"state": {
160160
"type": "outgoing-link",
161161
"state": {
162-
"file": "data-structure-algorithms/data-structure/Binary-Tree.md",
162+
"file": "data-management/Redis/Redis-Database.md",
163163
"linksCollapsed": false,
164164
"unlinkedCollapsed": true
165165
}
@@ -182,7 +182,7 @@
182182
"state": {
183183
"type": "outline",
184184
"state": {
185-
"file": "data-structure-algorithms/data-structure/Binary-Tree.md"
185+
"file": "data-management/Redis/Redis-Database.md"
186186
}
187187
}
188188
}
@@ -205,32 +205,32 @@
205205
},
206206
"active": "c7c1397df03f59cc",
207207
"lastOpenFiles": [
208+
"data-management/Redis/Redis-Datatype.md",
209+
"data-management/Redis/Redis-Database.md",
210+
"data-management/Redis/Redis-Cluster.md",
211+
"data-management/Redis/Redis 有用指令.md",
212+
"data-management/Redis/ReadRedis.md",
213+
"data-management/Redis/reproduce/Redis为什么变慢了-常见延迟问题定位与分析.md",
214+
"data-management/Redis/reproduce/Key 寻址算法.md",
215+
"data-management/Redis/reproduce/Cache-Design.md",
216+
"data-management/Redis/Redis-Conf.md",
217+
"data-management/Redis/Redis-Transaction.md",
218+
"data-management/Redis/Redis-Persistence.md",
219+
"data-management/Redis/Redis-Sentinel.md",
220+
"data-management/Redis/Redis-Master-Slave.md",
221+
"data-management/Redis/Redis-IO-Model.md",
222+
"data-management/MySQL/MySQL-Transaction.md",
223+
"interview/MySQL-FAQ.md",
224+
"data-structure-algorithms/data-structure/Binary-Tree.md",
225+
"interview/Micro-Services.md",
226+
"interview/虽然面试成功很大程度上 取决于你对面试官的问题是否能做到对答如流,但别忘了,并不是说你回答出全部问题就能 拿到 offer,更重要的一点是要比别的候选者回答得更出彩。因.md",
227+
"interview/未命名.md",
208228
"distribution/message-queue/Kafka/Kafka-Workflow.md",
209229
"distribution/message-queue/Kafka/Kafka-Producer.md",
210230
"distribution/message-queue/Kafka/Kafka-Version.md",
211231
"data-management/MySQL/MySQL-Optimization.md",
212232
"data-management/MySQL/MySQL-Lock.md",
213-
"data-management/Redis/ReadRedis.md",
214233
"data-management/Redis/Nosql-Overview.md",
215-
"data-management/MySQL/MySQL-Select.md",
216-
"data-management/MySQL/MySQL-Transaction.md",
217-
"data-management/MySQL/MySQL-Index.md",
218-
"data-management/MySQL/MySQL-Log.md",
219-
"interview/MySQL-FAQ.md",
220-
"data-management/MySQL/MySQL-Framework.md",
221-
"data-management/MySQL/MySQL-FAQ.md",
222-
"data-management/Redis/Redis-Datatype.md",
223-
"data-management/Redis/Redis-Master-Slave.md",
224-
"data-management/MySQL/readMySQL.md",
225-
"data-management/Redis/Redis 有用指令.md",
226-
"data-management/Redis/Redis-Lock.md",
227-
"data-management/Redis/Redis-IO-Model.md",
228-
"data-management/Redis/Redis-Database.md",
229-
"data-management/Redis/Redis-Conf.md",
230-
"data-management/Redis/Redis-Cluster.md",
231-
"data-management/Redis/reproduce/Key 寻址算法.md",
232-
"data-management/Redis/reproduce/Cache-Design.md",
233-
"data-management/MySQL/MySQL-Schema~.md",
234234
"data-structure-algorithms/algorithm",
235235
"data-structure-algorithms/未命名文件夹"
236236
]

docs/data-management/.DS_Store

0 Bytes
Binary file not shown.

docs/data-management/MySQL/MySQL-Transaction.md

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,60 @@ insert into T(t) values(1);
211211

212212
## 三、MVCC 多版本并发控制
213213

214+
#### 核心概念
215+
216+
1. **快照读(Snapshot Read)**
217+
- 每个事务在开始时,会获取一个数据快照,事务在读取数据时,总是读取该快照中的数据。
218+
- 这意味着即使在事务进行期间,其他事务对数据的更新也不会影响当前事务的读取。
219+
2. **版本链(Version Chain)**
220+
- 每个数据行都有多个版本,每个版本包含数据和元数据(如创建时间、删除时间等)。
221+
- 新版本的数据行会被链接到旧版本的数据行,形成一个版本链。
222+
3. **隐式锁(Implicit Locking)**
223+
- MVCC 通过版本管理避免了显式锁定,减少了锁争用问题。
224+
- 对于读取操作,事务读取其开始时的快照数据,不会被写操作阻塞。
225+
226+
#### MVCC 的底层实现
227+
228+
1. **数据行的多版本存储**
229+
- 每个数据行在物理存储上会有多个版本,每个版本包含该行在特定时间点的值。
230+
- 数据行版本包含元数据,如事务ID(Transaction ID)、创建时间戳和删除时间戳。
231+
2. **快照读取**
232+
- 每个事务在开始时,会记录当前系统的事务ID作为快照ID。
233+
- 读取数据时,只读取那些创建时间戳早于快照ID,并且删除时间戳为空或晚于快照ID的数据版本。
234+
3. **事务提交和版本更新**
235+
- 当一个事务对数据行进行更新时,会创建一个新的数据版本,并将其链接到现有版本链上。
236+
- 旧版本仍然存在,直到没有任何活动事务需要访问它们。
237+
238+
#### MVCC 在MySQL中的实现
239+
240+
MySQL InnoDB 存储引擎使用 MVCC 来实现可重复读(REPEATABLE READ)隔离级别,避免脏读、不可重复读和幻读问题。具体机制如下:
241+
242+
1. **隐藏列**
243+
- InnoDB 在每行记录中存储两个隐藏列:`trx_id`(事务ID)和`roll_pointer`(回滚指针)。
244+
- `trx_id` 记录最后一次修改该行的事务ID,`roll_pointer` 指向该行的上一版本。
245+
246+
> 其实,InnoDB下的 Compact 行结构,有三个隐藏的列
247+
>
248+
> | 列名 | 是否必须 | 描述 |
249+
> | -------------- | -------- | ------------------------------------------------------------ |
250+
> | row_id || 行ID,唯一标识一条记录(如果定义主键,它就没有啦) |
251+
> | transaction_id || 事务ID |
252+
> | roll_pointer || DB_ROLL_PTR是一个回滚指针,用于配合undo日志,指向上一个旧版本 |
253+
254+
2. **Undo日志**
255+
256+
- 每次数据更新时,InnoDB 会在 Undo 日志中记录旧版本数据。
257+
258+
- 如果需要读取旧版本数据,InnoDB 会通过 `roll_pointer` 找到 Undo 日志中的旧版本。
259+
260+
3. **一致性视图(Consistent Read View)**
261+
262+
- InnoDB 为每个事务创建一致性视图,记录当前活动的所有事务ID。
263+
264+
- 读取数据时,会根据一致性视图决定哪些版本的数据对当前事务可见。
265+
266+
267+
214268
在 MySQL 中,实际上每条记录在更新的时候都会同时记录一条回滚操作。记录上的最新值,通过回滚操作,都可以得到前一个状态的值。
215269

216270
假设一个值从 1 被按顺序改成了 2、3、4,在回滚日志里面就会有类似下面的记录。
@@ -264,6 +318,8 @@ MVCC 只在 COMMITTED READ(读提交)和 REPEATABLE READ(可重复读)
264318

265319
> 所谓的`MVCC`,就是通过生成一个`ReadView`,然后通过`ReadView`找到符合条件的记录版本(历史版本是由`undo日志`构建的),其实就像是在生成`ReadView`的那个时刻做了一次时间静止(就像用相机拍了一个快照),查询语句只能读到在生成`ReadView`之前已提交事务所做的更改,在生成`ReadView`之前未提交的事务或者之后才开启的事务所做的更改是看不到的。而写操作肯定针对的是最新版本的记录,读记录的历史版本和改动记录的最新版本本身并不冲突,也就是采用`MVCC`时,`读-写`操作并不冲突。
266320
321+
322+
267323
## 四、事务的实现
268324

269325
> 事务的隔离性是通过锁实现,而事务的原子性、一致性和持久性则是通过事务日志实现 。
0 Bytes
Binary file not shown.

docs/distribution/.DS_Store

0 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)