Skip to content

Commit 744e300

Browse files
committed
Update Java Notes
1 parent 8ad135f commit 744e300

File tree

2 files changed

+9
-7
lines changed

2 files changed

+9
-7
lines changed

DB.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3626,7 +3626,7 @@ MySQL 官方对索引的定义为:索引(index)是帮助 MySQL 高效获
36263626
- 单列索引:一个索引只包含单个列,一个表可以有多个单列索引(普通索引)
36273627
- 联合索引:顾名思义,就是将单列索引进行组合
36283628
- 唯一索引:索引列的值必须唯一,**允许有空值**,如果是联合索引,则列值组合必须唯一
3629-
* NULL 值必须只出现一次
3629+
* NULL 值可以出现多次,因为两个 NULL 比较的结果既不相等,也不不等,结果仍然是未知
36303630
* 可以声明不允许存储 NULL 值的非空唯一索引
36313631
- 外键索引:只有 InnoDB 引擎支持外键索引,用来保证数据的一致性、完整性和实现级联操作
36323632

@@ -4108,7 +4108,7 @@ B+ 树为了保持索引的有序性,在插入新值的时候需要做相应
41084108

41094109
#### 索引下推
41104110

4111-
索引条件下推优化(Index Condition Pushdown)是 MySQL5.6 添加,可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数
4111+
索引条件下推优化(Index Condition Pushdown,ICP)是 MySQL5.6 添加,可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数
41124112

41134113
索引下推充分利用了索引中的数据,在查询出整行数据之前过滤掉无效的数据,再去主键索引树上查找
41144114

@@ -5762,7 +5762,9 @@ roll_pointer 是一个指针,**指向记录对应的 undo log 日志**,一
57625762
在页面 Page Header 中,PAGE_FREE 属性指向垃圾链表的头节点,删除的工作过程:
57635763

57645764
* 将要删除的记录的 delete_flag 位置为 1,其他不做修改,这个过程叫 **delete mark**
5765+
57655766
* 在事务提交前,delete_flag = 1 的记录一直都会处于中间状态
5767+
57665768
* 事务提交后,有专门的线程将 delete_flag = 1 的记录从正常链表移除并加入垃圾链表,这个过程叫 **purge**
57675769

57685770
purge 线程在执行删除操作时会创建一个 ReadView,根据事务的可见性移除数据(隔离特性部分详解)
@@ -5859,9 +5861,7 @@ Rollback Segement 称为回滚段,每个回滚段中有 1024 个 undo slot
58595861

58605862
#### 并发控制
58615863

5862-
MVCC 全称 Multi-Version Concurrency Control,即多版本并发控制,用来**解决读写冲突的无锁并发控制**
5863-
5864-
MVCC 处理读写请求,可以做到在发生读写请求冲突时不用加锁,这个读是指的快照读,而不是当前读
5864+
MVCC 全称 Multi-Version Concurrency Control,即多版本并发控制,用来**解决读写冲突的无锁并发控制**,可以在发生读写请求冲突时不用加锁解决,这个读是指的快照读(也叫一致性读或一致性无锁读),而不是当前读:
58655865

58665866
* 快照读:实现基于 MVCC,因为是多版本并发,所以快照读读到的数据不一定是当前最新的数据,有可能是历史版本的数据
58675867
* 当前读:读取数据库记录是当前最新的版本(产生幻读、不可重复读),可以对读取的数据进行加锁,防止其他事务修改数据,是悲观锁的一种操作,读写操作加共享锁或者排他锁和串行化事务的隔离级别都是当前读
@@ -5933,6 +5933,8 @@ undo log 主要分为两种:
59335933

59345934
每次对数据库记录进行改动,都会产生的新版本的 undo log,随着更新次数的增多,所有的版本都会被 roll_pointer 属性连接成一个链表,把这个链表称之为**版本链**,版本链的头节点就是当前的最新的 undo log,链尾就是最早的旧 undo log
59355935

5936+
说明:因为 DELETE 删除记录,都是移动到垃圾链表中,不是真正的删除,所以才可以通过版本链访问原始数据
5937+
59365938
<img src="https://gitee.com/seazean/images/raw/master/DB/MySQL-MVCC版本链.png" style="zoom: 80%;" />
59375939

59385940
补充:undo 是逻辑日志,这里只是直观的展示出来
@@ -6042,7 +6044,7 @@ ID 为 0 的事务创建 Read View:
60426044

60436045
#### RC RR
60446046

6045-
Read View 用于支持 RC(Read Committed,读已提交)和 RR(Repeatable Read,可重复读)隔离级别的实现
6047+
Read View 用于支持 RC(Read Committed,读已提交)和 RR(Repeatable Read,可重复读)隔离级别的实现,所以 SELECT 在 RC 和 RR 隔离级别才使用 MVCC 读取记录
60466048

60476049
RR、RC 生成时机:
60486050

Java.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020

2121

22-
初学时笔记内容参考视频:https://www.bilibili.com/video/BV1TE41177mP,后随着学习的深入逐渐增加了很多知识
22+
初学时笔记内容参考视频:https://www.bilibili.com/video/BV1TE41177mP,随着学习的深入又增加了很多知识
2323

2424
给初学者的一些个人建议:
2525

0 commit comments

Comments
 (0)