diff --git "a/docs/cs-basics/data-structure/pictures/\346\240\221/\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221.drawio" "b/docs/cs-basics/data-structure/pictures/\346\240\221/\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221.drawio"
index 69326285015..107a75dd043 100644
--- "a/docs/cs-basics/data-structure/pictures/\346\240\221/\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221.drawio"
+++ "b/docs/cs-basics/data-structure/pictures/\346\240\221/\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221.drawio"
@@ -1 +1 @@
-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
\ No newline at end of file
+5VpLc+I4EP41OoaynpaOPJzsZatSNYedOW0ZWwHvGMwYM8D8+m3bsrGMCQwhhAyVQ9QtoUf3p+5PDYgOZ5un1F9M/05CHSPihBtER4gQjB0B/3LNttRIRUrFJI1CM2in+BL90kbpGO0qCvXSGpglSZxFC1sZJPO5DjJL56dpsraHvSSxverCn+g9xZfAj/e1/0RhNjWnIO5O/5eOJtNqZSxU2TPzq8HmJMupHybrhop6iA7TJMnK1mwz1HFuvMou5eceD/TWG0v1PDvlA5GOgn9/JWv68PTfdumwH6Px8sHM8tOPV+bAiIgY5huMoTHJG/Dfny2gMR8vF6VcDHhJYF04VrY1thI/VknV8bAsPNmHAYQvNrvOalanmgY2XM5Ur1apGzsg1kIEDgb+B2GwnkaZ/rLwg7xnDRAE3TSbxSBhaPrLRQmKl2ijw3xvURwPkzhJi4noy4sWQQD6ZZYm33WjJ3TV2HHqxZtmrmym00xvGipj9iedzHSWbmGI6aXCQMDcAVLJ6waijGraAFOl8w2GJ/XMOzdDw3j6N7xOOrzeNvE87OfXB6R5Mte2WcEU6fZrU/jWFEb5uZ1a2hrpgrZfJqs00K+ckJpQ4acTnR3Hvw6tKLDvyYaneIenKl2qYz+Lftqxo8t9ZoXnJCouUQUUZgOF8xYCynObTzXvensi1ZrIaU1UGmZvogJN9bHPBxg9KaxcIIyQOwojTArLqZR/cBhhB728XPjz8526hxXc7c5aVy73Z3iZUOe2vMyvdZfpHd1lzG0vM/rBXhbX8jK/Iy8zzG7Ly+5bid8myr422t8qogftHevLhYr01VSxFm6NKrI/gyqKM6kid6SNUUauShXlWyHZ+RZxjgCsArLTADJ+Fci3CEl+W5Bs57SzXy9S9ohkxMWEuUwQTFuMqLv7SoBVlwLszUZEcSL86E3Bj1PVE5RyyiQH8oGxDUasegorxST0MOG450GTMfsNxtl1H9ZVWfT931zsjt5cFN8YG8ddddm3ErXX81t3WDqWR28xK1bOvJG4RB0rXWFlJzMX91zMXSJdDiFMtqY/OWXSzmmqRVjnFq4Vs8jBmHXht6W4o7clF7cWs7qKvm9n8pcnRjX372GXNx+yPaeWD8RIEJ51GoHBdGp058ez6l58Mp7FlOwpIYjCDgOqJbkNQ+H0uMvyb0g5kVxwcV5A49QmWuzaROtwcfvCQcu9o6DV/lrqo2vb+HBx+8J0Wt4Rna5/8tCuTX2Ym7uq2+e92Xv805SZjhNl1plYTkhd/CMTEJbwlFc113WlXWTnGBK50ygPnZmBsBA9Lg5WoTilPUZ3u7gyp36PSv7VkLkHuONQ5Z8BmZRdBZntcsVe7f+dwSc6wOdxNPBQ30MeQ4NH1MfIEwjSvRoijyBZNGy6FNSI2SVPQJVSlO7n06com67G+ZzSQ0oiTyHpIgWryHzRfDmOpESKHGJTZhejOjOnp2R3zDqzOyymBkh5eaPPkBxd5JDPo8eju4fzggWANObnfURKmL2A8XNTuKhPGzZx84ZyC18M0aBfDH4sGm4+oMq4jagBOT6zQ4V9wU0oaUYDo/LjaDIHMYDrnj+PBjljiAI/7puOWRSG8SEWkyareZhzliLYxP5YxwM/+D4p9O3FwTTmp6KQw0q5EYAGxd+FSoPuccpa851mSCG/T2ZA3P0ctLysux/VUu9/
\ No newline at end of file
diff --git "a/docs/cs-basics/data-structure/pictures/\346\240\221/\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221.png" "b/docs/cs-basics/data-structure/pictures/\346\240\221/\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221.png"
index 564685ab7b7..bc0fe0dce14 100644
Binary files "a/docs/cs-basics/data-structure/pictures/\346\240\221/\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221.png" and "b/docs/cs-basics/data-structure/pictures/\346\240\221/\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221.png" differ
diff --git "a/docs/database/mysql/InnoDB\345\257\271MVCC\347\232\204\345\256\236\347\216\260.md" "b/docs/database/mysql/InnoDB\345\257\271MVCC\347\232\204\345\256\236\347\216\260.md"
index 83abbbceb60..4e929cd8013 100644
--- "a/docs/database/mysql/InnoDB\345\257\271MVCC\347\232\204\345\256\236\347\216\260.md"
+++ "b/docs/database/mysql/InnoDB\345\257\271MVCC\347\232\204\345\256\236\347\216\260.md"
@@ -56,6 +56,24 @@
### ReadView
+```c
+class ReadView {
+ /* ... */
+private:
+ trx_id_t m_low_limit_id; /* 大于这个 ID 的事务均不可见 */
+
+ trx_id_t m_up_limit_id; /* 小于这个 ID 的事务均可见 */
+
+ trx_id_t m_creator_trx_id; /* 创建该 Read View 的事务ID */
+
+ trx_id_t m_low_limit_no; /* 事务 Number, 小于该 Number 的 Undo Logs 均可以被 Purge */
+
+ ids_t m_ids; /* 创建 Read View 时的活跃事务列表 */
+
+ m_closed; /* 标记 Read View 是否 close */
+}
+```
+
[`Read View`](https://github.com/facebook/mysql-8.0/blob/8.0/storage/innobase/include/read0types.h#L298) 主要是用来做可见性判断,里面保存了 “当前对本事务不可见的其他活跃事务”
主要有以下字段:
@@ -65,6 +83,10 @@
- `m_ids`:`Read View` 创建时其他未提交的活跃事务 ID 列表。创建 `Read View`时,将当前未提交事务 ID 记录下来,后续即使它们修改了记录行的值,对于当前事务也是不可见的。`m_ids` 不包括当前事务自己和已提交的事务(正在内存中)
- `m_creator_trx_id`:创建该 `Read View` 的事务 ID
+**事务可见性示意图**([图源](https://leviathan.vip/2019/03/20/InnoDB%E7%9A%84%E4%BA%8B%E5%8A%A1%E5%88%86%E6%9E%90-MVCC/#MVCC-1)):
+
+
+
### undo-log
`undo log` 主要有两个作用:
@@ -90,7 +112,7 @@

-不同事务或者相同事务的对同一记录行的修改,会使该记录行的 `undo log` 成为一条链表,链首就是最新的记录,链尾就是最早的旧记录
+不同事务或者相同事务的对同一记录行的修改,会使该记录行的 `undo log` 成为一条链表,链首就是最新的记录,链尾就是最早的旧记录。
### 数据可见性算法
@@ -98,7 +120,7 @@
[具体的比较算法](https://github.com/facebook/mysql-8.0/blob/8.0/storage/innobase/include/read0types.h#L161)如下:[图源](https://leviathan.vip/2019/03/20/InnoDB%E7%9A%84%E4%BA%8B%E5%8A%A1%E5%88%86%E6%9E%90-MVCC/#MVCC-1)
-
+
1. 如果记录 DB_TRX_ID < m_up_limit_id,那么表明最新修改该行的事务(DB_TRX_ID)在当前事务创建快照之前就提交了,所以该记录行的值对当前事务是可见的
@@ -106,7 +128,7 @@
3. m_ids 为空,则表明在当前事务创建快照之前,修改该行的事务就已经提交了,所以该记录行的值对当前事务是可见的
-4. 如果 m_up_limit_id <= DB_TRX_ID < m_up_limit_id,表明最新修改该行的事务(DB_TRX_ID)在当前事务创建快照的时候可能处于“活动状态”或者“已提交状态”;所以就要对活跃事务列表 m_ids 进行查找(源码中是用的二分查找,因为是有序的)
+4. 如果 m_low_limit_id <= DB_TRX_ID < m_up_limit_id,表明最新修改该行的事务(DB_TRX_ID)在当前事务创建快照的时候可能处于“活动状态”或者“已提交状态”;所以就要对活跃事务列表 m_ids 进行查找(源码中是用的二分查找,因为是有序的)
- 如果在活跃事务列表 m_ids 中能找到 DB_TRX_ID,表明:① 在当前事务创建快照前,该记录行的值被事务 ID 为 DB_TRX_ID 的事务修改了,但没有提交;或者 ② 在当前事务创建快照后,该记录行的值被事务 ID 为 DB_TRX_ID 的事务修改了。这些情况下,这个记录行的值对当前事务都是不可见的。跳到步骤 5
@@ -210,6 +232,6 @@
## 参考
- **《MySQL 技术内幕 InnoDB 存储引擎第 2 版》**
-
- [Innodb 中的事务隔离级别和锁的关系](https://tech.meituan.com/2014/08/20/innodb-lock.html)
- [MySQL 事务与 MVCC 如何实现的隔离级别](https://blog.csdn.net/qq_35190492/article/details/109044141)
+- [InnoDB 事务分析-MVCC](https://leviathan.vip/2019/03/20/InnoDB%E7%9A%84%E4%BA%8B%E5%8A%A1%E5%88%86%E6%9E%90-MVCC/)
diff --git "a/docs/database/mysql/\344\270\200\345\215\203\350\241\214MySQL\345\255\246\344\271\240\347\254\224\350\256\260.md" "b/docs/database/mysql/\344\270\200\345\215\203\350\241\214MySQL\345\255\246\344\271\240\347\254\224\350\256\260.md"
index 385aa37dc7a..bf8b5e58dac 100644
--- "a/docs/database/mysql/\344\270\200\345\215\203\350\241\214MySQL\345\255\246\344\271\240\347\254\224\350\256\260.md"
+++ "b/docs/database/mysql/\344\270\200\345\215\203\350\241\214MySQL\345\255\246\344\271\240\347\254\224\350\256\260.md"
@@ -609,7 +609,7 @@ CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name
- 事务开始和结束时,外部数据一致
- 在整个事务过程中,操作是连续的
3. 隔离性(Isolation)
- 多个用户并发访问数据库时,一个用户的事务不能被其它用户的事物所干扰,多个并发事务之间的数据要相互隔离。
+ 多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间的数据要相互隔离。
4. 持久性(Durability)
一个事务一旦被提交,它对数据库中的数据改变就是永久性的。
-- 事务的实现
diff --git a/docs/java/multi-thread/images/thread-pool/7888fb0d-4699-4d3a-8885-405cb5415617.png b/docs/java/multi-thread/images/thread-pool/7888fb0d-4699-4d3a-8885-405cb5415617.png
deleted file mode 100644
index a3678a72916..00000000000
Binary files a/docs/java/multi-thread/images/thread-pool/7888fb0d-4699-4d3a-8885-405cb5415617.png and /dev/null differ
diff --git "a/docs/java/multi-thread/images/thread-pool/\347\272\277\347\250\213\346\261\240\344\275\277\347\224\250\344\270\215\345\275\223\345\257\274\350\207\264\346\255\273\351\224\201.drawio" "b/docs/java/multi-thread/images/thread-pool/\347\272\277\347\250\213\346\261\240\344\275\277\347\224\250\344\270\215\345\275\223\345\257\274\350\207\264\346\255\273\351\224\201.drawio"
new file mode 100644
index 00000000000..3a2c775adc7
--- /dev/null
+++ "b/docs/java/multi-thread/images/thread-pool/\347\272\277\347\250\213\346\261\240\344\275\277\347\224\250\344\270\215\345\275\223\345\257\274\350\207\264\346\255\273\351\224\201.drawio"
@@ -0,0 +1 @@
+7Vpbj5s4GP01fkwFBgw8QkLaSl2p0qzU3acVA+ayJTglziTpr18bTLg5WaYThrQdaTRjf75gn/Md+7M9QFtuju8Lf5v8QUKcAaiER6CtAISqqiD2h1tOlcWyYWWIizQUlRrDQ/odC6MirPs0xLtORUpIRtNt1xiQPMcB7dj8oiCHbrWIZN2vbv0YDwwPgZ8NrV/SkCZiFtBs7B9wGif1l1VkVyUbv64sZrJL/JAcWibNA9qyIIRWqc1xiTMOXo1L1W59ofQ8sALndEyDKF4s0OLpz4do5cF/PirF8tNuoVW9PPnZXkxYDJaeagQKss9DzDtRgeYekpTih60f8NID45zZErrJRHGUZtmSZKQo22qhj60oYPYdLchX3CpBgYUfI1YynIaY2RMuKD62TGJa7zHZYFqcWBVRaguEhYsZInto+FJrEpIWV0jYfOEi8bnjBkWWEEA+A1R9WlCjCKNACmpo2o+KMgmoqj43qsaNUb09RlCbGyM0xMgzgGsClyXYbxdYa+BZwPK4kRWxrI24xWVpHXgIuA5g02KVbae06LwV++GVHeCoA9AZVrSLbNcvc5LjnhMLk5+lcc6yAWMAM7vLkU/Z2uuIgk0ahvwzUiobsrnHRySnYvdQ0W3YPe9Bgl5Twq4pYRdOxa45il0ELBs4JieVsWUteR3HKxNvpA5IVdHcrFoSVhGwl8Bx3qT6g6xKY4BXZdWW7FYo4+jvtn7eoQV92/MYsMRlsSuBcVgFBsmxKWSpuPzLhe4Ad80TDnMPt/QEFTiKzDfWwF0Cy+IWVsG1ygVjDSxN3o/NSpXSkVhXTl63t+uxMyiq4YvB9B2MAcMC80tu0A5pej7QjxsNbIW6LMSx4KOGbuQ1RtdpdDh0GmgZQ6dR7am8RhLT4JCdR0SWFDQhMcn9zGusPXU1dT4RshVw/4spPQm8/T0lXTIYgsXpL9G+zPzNM++MOrs6tgtXp+cKeUf2RYCvzFutj3Z+EWN6raKgg6NyleICZz5Nn7qnuNvzpb3xdZ0vdFd81ePubLYmXyBdNNw/hxvoxGfhCXZGo78zyuKdVz2jQP031QwcqxnrrjQDjTn4mgN3+65wr8f9ghBSRZdCyAsrHhwb6N3/pWB/4dNnvxaE6Ddd+LSRAqzZuBMB1nf8b3xdAki9K75U2WPGxAtm/usumGj2SFEd8ZCC89Dhz3zgfFUV+rvkDHQLVG7/7FOKi7y0QEU7Q1o/7cGukKBxDdr/dfsWcIYEt9o2Wh3iC59JykbS8Ibsd0aXuf6tViV50a4hZdiV2XUBQ+91VC0Jg45Kds8TfwHhsjeeSl+clVEK1pmCS+kORGwAZ1Veig3OeQu1JePqSxPIeMS7XXsR128ja1PpHQCV2WUteaV67jqty9fpKxRPE9pOQJCmzk6Q5EliaoJgR4OTbaWv83bep1SfX3Mvf4/4AUp/Gs0Zs2uu/thrEpT/yppD81MquWyentKfRnOm5LntVgSxbPOPdVV02vx7oub9Bw==
\ No newline at end of file
diff --git "a/docs/java/multi-thread/images/thread-pool/\347\272\277\347\250\213\346\261\240\344\275\277\347\224\250\344\270\215\345\275\223\345\257\274\350\207\264\346\255\273\351\224\201.png" "b/docs/java/multi-thread/images/thread-pool/\347\272\277\347\250\213\346\261\240\344\275\277\347\224\250\344\270\215\345\275\223\345\257\274\350\207\264\346\255\273\351\224\201.png"
new file mode 100644
index 00000000000..1ad4f811ac8
Binary files /dev/null and "b/docs/java/multi-thread/images/thread-pool/\347\272\277\347\250\213\346\261\240\344\275\277\347\224\250\344\270\215\345\275\223\345\257\274\350\207\264\346\255\273\351\224\201.png" differ
diff --git "a/docs/java/multi-thread/java\347\272\277\347\250\213\346\261\240\345\255\246\344\271\240\346\200\273\347\273\223.md" "b/docs/java/multi-thread/java\347\272\277\347\250\213\346\261\240\345\255\246\344\271\240\346\200\273\347\273\223.md"
index 1adf4081fef..98f8fb0f1bd 100644
--- "a/docs/java/multi-thread/java\347\272\277\347\250\213\346\261\240\345\255\246\344\271\240\346\200\273\347\273\223.md"
+++ "b/docs/java/multi-thread/java\347\272\277\347\250\213\346\261\240\345\255\246\344\271\240\346\200\273\347\273\223.md"
@@ -54,7 +54,7 @@
这里借用《Java 并发编程的艺术》提到的来说一下**使用线程池的好处**:
- **降低资源消耗**。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
-- **提高响应速度**。当任务到达时,任务可以不需要的等到线程创建就能立即执行。
+- **提高响应速度**。当任务到达时,任务可以不需要等到线程创建就能立即执行。
- **提高线程的可管理性**。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
## 二 Executor 框架
diff --git "a/docs/java/multi-thread/\346\213\277\346\235\245\345\215\263\347\224\250\347\232\204\347\272\277\347\250\213\346\261\240\346\234\200\344\275\263\345\256\236\350\267\265.md" "b/docs/java/multi-thread/\346\213\277\346\235\245\345\215\263\347\224\250\347\232\204\347\272\277\347\250\213\346\261\240\346\234\200\344\275\263\345\256\236\350\267\265.md"
index 06b2ccf492e..b153a7bf93c 100644
--- "a/docs/java/multi-thread/\346\213\277\346\235\245\345\215\263\347\224\250\347\232\204\347\272\277\347\250\213\346\261\240\346\234\200\344\275\263\345\256\236\350\267\265.md"
+++ "b/docs/java/multi-thread/\346\213\277\346\235\245\345\215\263\347\224\250\347\232\204\347\272\277\347\250\213\346\261\240\346\234\200\344\275\263\345\256\236\350\267\265.md"
@@ -182,11 +182,9 @@ Finished all threads
上面的代码可能会存在死锁的情况,为什么呢?画个图给大家捋一捋。
-试想这样一种极端情况:
+试想这样一种极端情况:假如我们线程池的核心线程数为 **n**,父任务(扣费任务)数量为 **n**,父任务下面有两个子任务(扣费任务下的子任务),其中一个已经执行完成,另外一个被放在了任务队列中。由于父任务把线程池核心线程资源用完,所以子任务因为无法获取到线程资源无法正常执行,一直被阻塞在队列中。父任务等待子任务执行完成,而子任务等待父任务释放线程池资源,这也就造成了 **"死锁"**。
-假如我们线程池的核心线程数为 **n**,父任务(扣费任务)数量为 **n**,父任务下面有两个子任务(扣费任务下的子任务),其中一个已经执行完成,另外一个被放在了任务队列中。由于父任务把线程池核心线程资源用完,所以子任务因为无法获取到线程资源无法正常执行,一直被阻塞在队列中。父任务等待子任务执行完成,而子任务等待父任务释放线程池资源,这也就造成了 **"死锁"**。
-
-
+
解决方法也很简单,就是新增加一个用于执行子任务的线程池专门为其服务。
diff --git "a/docs/system-design/framework/spring/Spring\344\272\213\345\212\241\346\200\273\347\273\223.md" "b/docs/system-design/framework/spring/Spring\344\272\213\345\212\241\346\200\273\347\273\223.md"
index 618e600e71b..ef812265888 100644
--- "a/docs/system-design/framework/spring/Spring\344\272\213\345\212\241\346\200\273\347\273\223.md"
+++ "b/docs/system-design/framework/spring/Spring\344\272\213\345\212\241\346\200\273\347\273\223.md"
@@ -1,4 +1,4 @@
-大家好,我是 Guide 哥,前段答应读者的 **Spring 事务**分析总结终于来了。这部分内容比较重要,不论是对于工作还是面试,但是网上比较好的参考资料比较少。
+大家好,我是 Guide 哥,前段时间答应读者的 **Spring 事务**分析总结终于来了。这部分内容比较重要,不论是对于工作还是面试,但是网上比较好的参考资料比较少。
如果本文有任何不对或者需要完善的地方,请帮忙指出!Guide 哥感激不尽!
diff --git "a/docs/system-design/framework/spring/Spring\345\270\270\350\247\201\351\227\256\351\242\230\346\200\273\347\273\223.md" "b/docs/system-design/framework/spring/Spring\345\270\270\350\247\201\351\227\256\351\242\230\346\200\273\347\273\223.md"
index cf8ffffa00c..986364fd7d7 100644
--- "a/docs/system-design/framework/spring/Spring\345\270\270\350\247\201\351\227\256\351\242\230\346\200\273\347\273\223.md"
+++ "b/docs/system-design/framework/spring/Spring\345\270\270\350\247\201\351\227\256\351\242\230\346\200\273\347\273\223.md"
@@ -138,7 +138,7 @@ Spring 中 Bean 的作用域通常有下面几种:
- **singleton** : 唯一 bean 实例,Spring 中的 bean 默认都是单例的,对单例设计模式的应用。
- **prototype** : 每次请求都会创建一个新的 bean 实例。
- **request** : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
-- **session** : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。
+- **session** : 每一次来自新 session 的 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。
- **global-session** : 全局 session 作用域,仅仅在基于 portlet 的 web 应用中才有意义,Spring5 已经没有了。Portlet 是能够生成语义代码(例如:HTML)片段的小型 Java Web 插件。它们基于 portlet 容器,可以像 servlet 一样处理 HTTP 请求。但是,与 servlet 不同,每个 portlet 都有不同的会话。
**如何配置 bean 的作用域呢?**
@@ -231,7 +231,7 @@ public OneService getService(status) {
- 如果涉及到一些属性值 利用 `set()`方法设置一些属性值。
- 如果 Bean 实现了 `BeanNameAware` 接口,调用 `setBeanName()`方法,传入 Bean 的名字。
- 如果 Bean 实现了 `BeanClassLoaderAware` 接口,调用 `setBeanClassLoader()`方法,传入 `ClassLoader`对象的实例。
-- 如果 Bean 实现了 `BeanFactoryAware` 接口,调用 `setBeanClassLoader()`方法,传入 `ClassLoade` r 对象的实例。
+- 如果 Bean 实现了 `BeanFactoryAware` 接口,调用 `setBeanFactory()`方法,传入 `BeanFactory`对象的实例。
- 与上面的类似,如果实现了其他 `*.Aware`接口,就调用相应的方法。
- 如果有和加载这个 Bean 的 Spring 容器相关的 `BeanPostProcessor` 对象,执行`postProcessBeforeInitialization()` 方法
- 如果 Bean 实现了`InitializingBean`接口,执行`afterPropertiesSet()`方法。