diff --git a/Database.md b/Database.md index fd4c66a..652df6e 100644 --- a/Database.md +++ b/Database.md @@ -1189,35 +1189,15 @@ public void addGoods(){ 枚举类Propagation中定义了七种事务传播机制如下: -- `REQUIRED`(required) - - Spring默认的传播机制,能满足绝大部分业务需求,如果外层有事务,则当前事务加入到外层事务,一块提交,一块回滚。如果外层没有事务,新建一个事务执行 - -- `REQUIRES_NEW`(requires_new,新创建事务) - - 该事务传播机制是每次都会新开启一个事务,同时把外层事务挂起,当当前事务执行完毕,恢复上层事务的执行。如果外层没有事务,执行当前新开启的事务即可 - -- `SUPPORTS`(supports) - - 如果外层有事务,则加入外层事务,如果外层没有事务,则直接使用非事务方式执行。完全依赖外层的事务 - -- `NOT_SUPPORTED`(not_supported,传播机制不支持事务) - - 该传播机制不支持事务,如果外层存在事务则挂起,执行完当前代码,则恢复外层事务,无论是否异常都不会回滚当前的代码 - -- `NEVER`(never) - - 该传播机制不支持外层事务,即如果外层有事务就抛出异常 - -- `MANDATORY`(mandatory) - - 与NEVER相反,如果外层没有事务,则抛出异常 - -- `NESTED`(nested,嵌套事务) - - 该传播机制的特点是可以保存状态保存点,当前事务回滚到某一个点,从而避免所有的嵌套事务都回滚,即各自回滚各自的,如果子事务没有把异常吃掉,基本还是会引起全部回滚的。 - +- `REQUIRED`(required,要求,Spring默认):**当前存在事务,则加入该事务;当前没有事务,则创建一个新的事务** +- `REQUIRES_NEW`(requires_new,要求新的):**创建一个新事务,如果存在当前事务,则挂起该事务** +- `SUPPORTS`(supports,支持):**如果当前存在事务,则加入当前事务;如果当前没有事务,就以非事务方法执行** +- `NOT_SUPPORTED`(not_supported,不支持):**始终以非事务方式执行,如果当前存在事务,则挂起当前事务** +- `NEVER`(never,都不):**不使用事务,如果当前事务存在,则抛出异常** +- `MANDATORY`(mandatory,强制):**如果当前存在事务,则加入当前事务;如果当前事务不存在,则抛出异常** +- `NESTED`(nested,嵌套)**如果当前事务存在,则在嵌套事务中执行,否则REQUIRED的操作一样(开启一个事务)** + ### 事务回滚规则 diff --git a/Middleware.md b/Middleware.md index c985913..3aac9ed 100644 --- a/Middleware.md +++ b/Middleware.md @@ -127,7 +127,7 @@ org.springframework.boot.env.YamlPropertySourceLoader - **Set:** 去重、赞、踩、共同好友等 - **Zset:** 访问量排行榜、点击量排行榜等 -![img](images/Middleware/1289934-20190621163930814-1395015700.png) +![Redis-基本数据类型](images/Middleware/Redis-基本数据类型.png) ### String(字符串) @@ -137,7 +137,7 @@ String 数据结构是简单的 key-value 类型,value 不仅可以是 String ### Hash(字典) -![img](images/Middleware/1289934-20190621232209365-1000366002.png) +![Redis-Hash](images/Middleware/Redis-Hash.png) 在 Memcached 中,我们经常将一些结构化的信息打包成 hashmap,在客户端序列化后存储为一个字符串的值(一般是 JSON 格式),比如用户的昵称、年龄、性别、积分等。这时候在需要修改其中某一项时,通常需要将字符串(JSON)取出来,然后进行反序列化,修改某一项的值,再序列化成字符串(JSON)存储回去。简单修改一个属性就干这么多事情,消耗必定是很大的,也不适用于一些可能并发操作的场合(比如两个并发的操作都需要修改积分)。而 Redis 的 Hash 结构可以使你像在数据库中 Update 一个属性一样只修改某一项属性值。 @@ -158,7 +158,7 @@ List 说白了就是链表(redis 使用双端链表实现的 List),相信 - 微博 TimeLine - 消息队列 -![img](images/Middleware/1289934-20190621233618769-504231907.png) +![Redis-List](images/Middleware/Redis-List.png) 使用列表的技巧 @@ -175,7 +175,7 @@ List 说白了就是链表(redis 使用双端链表实现的 List),相信 ### Set(集合) -![img](images/Middleware/1289934-20190622001013515-677922001.png) +![Redis-Set](images/Middleware/Redis-Set.png) Set 就是一个集合,集合的概念就是一堆不重复值的组合。利用 Redis 提供的 Set 数据结构,可以存储一些集合性的数据。比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。因为 Redis 非常人性化的为集合提供了求交集、并集、差集等操作,那么就可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。 @@ -192,7 +192,7 @@ Set 就是一个集合,集合的概念就是一堆不重复值的组合。利 ### Sorted Set(有序集合) -![img](images/Middleware/1289934-20190622000959260-539243592.png) +![Redis-SortedSet](images/Middleware/Redis-SortedSet.png) 和Sets相比,Sorted Sets是将 Set 中的元素增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列,比如一个存储全班同学成绩的 Sorted Sets,其集合 value 可以是同学的学号,而 score 就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。另外还可以用 Sorted Sets 来做带权重的队列,比如普通消息的 score 为1,重要消息的 score 为2,然后工作线程可以选择按 score 的倒序来获取工作任务。让重要的任务优先执行。 @@ -4962,6 +4962,32 @@ MethodInterceptor是AOP项目中的拦截器,它拦截的目标是方法,即 +# SpringBoot + +## MVC + +### HTTP请求处理流程 + +### 参数绑定 + +### 过滤器、拦截器、AOP执行顺序 + +## IOC + +### Bean的加载过程 + +### Bean实例化的过程 + +## AOP + + + +## Others + + + + + # SpringCloud ![SpringCloud](images/Middleware/SpringCloud.png) diff --git a/README.md b/README.md index ad8a193..06d9a42 100644 --- a/README.md +++ b/README.md @@ -200,6 +200,10 @@ +关键组件:Redis、RocketMQ、MySQL、Zookeeper、Netty、MyBatis + + + # [6 Solution](Solution.md) ![ServiceDowngrade](images/README/ServiceDowngrade.png)