From 83e29192b415de8d9384488cfb14eaba99d609d8 Mon Sep 17 00:00:00 2001 From: wangtong Date: Wed, 20 Apr 2022 15:09:00 +0800 Subject: [PATCH 1/5] =?UTF-8?q?[=E4=BF=AE=E6=94=B9]=EF=BC=9A=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=20MySQL=E4=BA=8B=E5=8A=A1=E9=9A=94=E7=A6=BB=E7=BA=A7?= =?UTF-8?q?=E5=88=AB=E8=AF=A6=E8=A7=A3=20=E5=85=B3=E4=BA=8E=E5=B9=BB?= =?UTF-8?q?=E8=AF=BB=E7=9A=84=E6=A1=88=E4=BE=8B=E6=BC=94=E7=A4=BA=E5=92=8C?= =?UTF-8?q?=E8=A7=A3=E5=86=B3=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/database/mysql/transaction-isolation-level.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/database/mysql/transaction-isolation-level.md b/docs/database/mysql/transaction-isolation-level.md index bdd5072d..7f20ff19 100644 --- a/docs/database/mysql/transaction-isolation-level.md +++ b/docs/database/mysql/transaction-isolation-level.md @@ -127,11 +127,14 @@ SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTE
+ #### 幻读 ##### 演示幻读出现的情况 -![](http://101.43.132.98:98/images/phantom_read.png) +
+ +
sql 脚本1 在第一次查询工资为 500 的记录时只有一条,sql 脚本 2 插入了一条工资为 500 的记录,提交之后;sql 脚本 1 在同一个事务中再次使用当前读查询发现出现了两条工资为 500 的记录这种就是幻读。 From b88d22cd49deda3e0aeed59e09482ba6253d00a6 Mon Sep 17 00:00:00 2001 From: wangtong Date: Wed, 20 Apr 2022 15:25:39 +0800 Subject: [PATCH 2/5] =?UTF-8?q?[=E4=BF=AE=E6=94=B9]=EF=BC=9A=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=20Spring=20=E4=BA=8B=E5=8A=A1=E6=80=BB=E7=BB=93=20?= =?UTF-8?q?=E5=A4=9A=E4=BA=86=E4=B8=80=E4=B8=AA=20=E5=85=88=20=E5=AD=97?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/system-design/framework/spring/spring-transaction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/system-design/framework/spring/spring-transaction.md b/docs/system-design/framework/spring/spring-transaction.md index 02d660c1..5db995ce 100644 --- a/docs/system-design/framework/spring/spring-transaction.md +++ b/docs/system-design/framework/spring/spring-transaction.md @@ -70,7 +70,7 @@ public class OrdersService { 这里再多提一下一个非常重要的知识点: **MySQL 怎么保证原子性的?** -我们知道如果想要保证事务的原子性,就需要在异常发生时,对已经执行的操作进行**回滚**,在 MySQL 中,恢复机制是通过 **回滚日志(undo log)** 实现的,所有事务进行的修改都会先先记录到这个回滚日志中,然后再执行相关的操作。如果执行过程中遇到异常的话,我们直接利用 **回滚日志** 中的信息将数据回滚到修改之前的样子即可!并且,回滚日志会先于数据持久化到磁盘上。这样就保证了即使遇到数据库突然宕机等情况,当用户再次启动数据库的时候,数据库还能够通过查询回滚日志来回滚将之前未完成的事务。 +我们知道如果想要保证事务的原子性,就需要在异常发生时,对已经执行的操作进行**回滚**,在 MySQL 中,恢复机制是通过 **回滚日志(undo log)** 实现的,所有事务进行的修改都会先记录到这个回滚日志中,然后再执行相关的操作。如果执行过程中遇到异常的话,我们直接利用 **回滚日志** 中的信息将数据回滚到修改之前的样子即可!并且,回滚日志会先于数据持久化到磁盘上。这样就保证了即使遇到数据库突然宕机等情况,当用户再次启动数据库的时候,数据库还能够通过查询回滚日志来回滚将之前未完成的事务。 ### Spring 支持两种方式的事务管理 From 3f85327ab381ac54de794339c562dc60c62069a2 Mon Sep 17 00:00:00 2001 From: wangtong Date: Wed, 20 Apr 2022 15:54:44 +0800 Subject: [PATCH 3/5] =?UTF-8?q?[=E4=BF=AE=E6=94=B9]=EF=BC=9A=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=20Spring=20=E4=BA=8B=E5=8A=A1=E6=80=BB=E7=BB=93=20?= =?UTF-8?q?=E5=A4=9A=E4=BA=86=E4=B8=A4=E4=B8=AA=E5=AD=97=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/system-design/framework/spring/spring-transaction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/system-design/framework/spring/spring-transaction.md b/docs/system-design/framework/spring/spring-transaction.md index 5db995ce..8cb2cb17 100644 --- a/docs/system-design/framework/spring/spring-transaction.md +++ b/docs/system-design/framework/spring/spring-transaction.md @@ -251,7 +251,7 @@ public interface TransactionDefinition { `PlatformTransactionManager.getTransaction(…)`方法返回一个 `TransactionStatus` 对象。 -**TransactionStatus 接口接口内容如下:** +**TransactionStatus 接口内容如下:** ```java public interface TransactionStatus{ From 8d83d91e2d0ff2f660f9de9c7ba18f9f7e1908ac Mon Sep 17 00:00:00 2001 From: wangtong Date: Wed, 20 Apr 2022 16:47:48 +0800 Subject: [PATCH 4/5] =?UTF-8?q?[=E4=BF=AE=E6=94=B9]=EF=BC=9A=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=20Spring=20=E4=BA=8B=E5=8A=A1=E6=80=BB=E7=BB=93=20?= =?UTF-8?q?=E9=94=99=E5=88=AB=E5=AD=97=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/spring/spring-transaction.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/system-design/framework/spring/spring-transaction.md b/docs/system-design/framework/spring/spring-transaction.md index 8cb2cb17..0fec1b68 100644 --- a/docs/system-design/framework/spring/spring-transaction.md +++ b/docs/system-design/framework/spring/spring-transaction.md @@ -265,7 +265,7 @@ public interface TransactionStatus{ ### 事务属性详解 -际业务开发中,大家一般都是使用 `@Transactional` 注解来开启事务,很多人并不清楚这个参数里面的参数是什么意思,有什么用。为了更好的在项目中使用事务管理,强烈推荐好好阅读一下下面的内容。 +实际业务开发中,大家一般都是使用 `@Transactional` 注解来开启事务,但很多人并不清楚这个注解里面的参数是什么意思,有什么用。为了更好的在项目中使用事务管理,强烈推荐好好阅读一下下面的内容。 #### 事务传播行为 @@ -273,7 +273,7 @@ public interface TransactionStatus{ 当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。 -举个例子:我们在 A 类的`aMethod()`方法中调用了 B 类的 `bMethod()` 方法。这个时候就涉及到业务层方法之间互相调用的事务问题。如果我们的 `bMethod()`如果发生异常需要回滚,如何配置事务传播行为才能让 `aMethod()`也跟着回滚呢?这个时候就需要事务传播行为的知识了,如果你不知道的话一定要好好看一下。 +举个例子:我们在 A 类的`aMethod()`方法中调用了 B 类的 `bMethod()` 方法。这个时候就涉及到业务层方法之间互相调用的事务问题。如果我们的 `bMethod()`如果发生异常需要回滚,如何配置事务传播行为才能让 `aMethod()`也跟着回滚呢?这个时候就需要事务传播行为的知识了,如果你不知道的话一定要好好看一下。 ```java Class A { @@ -308,7 +308,7 @@ public interface TransactionDefinition { } ``` -不过如此,为了方便使用,Spring 会相应地定义了一个枚举类:`Propagation` +不过,为了方便使用,Spring 相应地定义了一个枚举类:`Propagation` ```java package org.springframework.transaction.annotation; @@ -455,7 +455,7 @@ public interface TransactionDefinition { } ``` -和事务传播行为这块一样,为了方便使用,Spring 也相应地定义了一个枚举类:`Isolation` +和事务传播行为那块一样,为了方便使用,Spring 也相应地定义了一个枚举类:`Isolation` ```java public enum Isolation { @@ -506,9 +506,9 @@ mysql> SELECT @@tx_isolation; ~~这里需要注意的是:与 SQL 标准不同的地方在于 InnoDB 存储引擎在 **REPEATABLE-READ(可重读)** 事务隔离级别下使用的是 Next-Key Lock 锁算法,因此可以避免幻读的产生,这与其他数据库系统(如 SQL Server)是不同的。所以说 InnoDB 存储引擎的默认支持的隔离级别是 **REPEATABLE-READ(可重读)** 已经可以完全保证事务的隔离性要求,即达到了 SQL 标准的 **SERIALIZABLE(可串行化)** 隔离级别。~~ -🐛 问题更正:**MySQL InnoDB 的 REPEATABLE-READ(可重读)并不保证避免幻读,需要应用使用加锁读来保证。而这个加锁读使用到的机制就是 Next-Key Locks。** +🐛 问题更正:**MySQL InnoDB 的 REPEATABLE-READ(可重读)并不保证避免幻读,需要使用加锁读来保证。而这个加锁读使用到的机制就是 Next-Key Locks。** -因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是 **READ-COMMITTED(读取提交内容)** ,但是你要知道的是 InnoDB 存储引擎默认使用 **REPEAaTABLE-READ(可重读)** 并不会有任何性能损失。 +因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是 **READ-COMMITTED(读取提交内容)** ,但是你要知道的是 InnoDB 存储引擎默认使用 **REPEATABLE-READ(可重读)** 并不会有任何性能损失。 InnoDB 存储引擎在 **分布式事务** 的情况下一般会用到 **SERIALIZABLE(可串行化)** 隔离级别。 @@ -518,7 +518,7 @@ InnoDB 存储引擎在 **分布式事务** 的情况下一般会用到 **SERIALI #### 事务超时属性 -所谓事务超时,就是指一个事务所允许执行的最长时间,如果超过该时间限制但事务还没有完成,则自动回滚事务。在 `TransactionDefinition` 中以 int 的值来表示超时时间,其单位是秒,默认值为-1。 +所谓事务超时,就是指一个事务所允许执行的最长时间,如果超过该时间限制但事务还没有完成,则自动回滚事务。在 `TransactionDefinition` 中以 int 的值来表示超时时间,其单位是秒,默认值为-1,这表示事务的超时时间取决于底层事务系统或者没有超时时间。 #### 事务只读属性 From d7021cdd2f388c00c0aaf3f89bc1544e0e9cf9ce Mon Sep 17 00:00:00 2001 From: wangtong Date: Wed, 20 Apr 2022 18:19:08 +0800 Subject: [PATCH 5/5] =?UTF-8?q?[=E4=BF=AE=E6=94=B9]=EF=BC=9A=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=20Spring=20=E8=AE=BE=E8=AE=A1=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E6=80=BB=E7=BB=93=20=E9=94=99=E5=88=AB=E5=AD=97=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/spring/spring-design-patterns-summary.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/system-design/framework/spring/spring-design-patterns-summary.md b/docs/system-design/framework/spring/spring-design-patterns-summary.md index fede1bde..d38954df 100644 --- a/docs/system-design/framework/spring/spring-design-patterns-summary.md +++ b/docs/system-design/framework/spring/spring-design-patterns-summary.md @@ -5,7 +5,7 @@ tag: - Spring --- -JDK 中用到了那些设计模式?Spring 中用到了那些设计模式?这两个问题,在面试中比较常见。我在网上搜索了一下关于 Spring 中设计模式的讲解几乎都是千篇一律,而且大部分都年代久远。所以,花了几天时间自己总结了一下,由于我的个人能力有限,文中如有任何错误各位都可以指出。另外,文章篇幅有限,对于设计模式以及一些源码的解读我只是一笔带过,这篇文章的主要目的是回顾一下 Spring 中的设计模式。 +JDK 中用到了哪些设计模式?Spring 中用到了哪些设计模式?这两个问题,在面试中比较常见。我在网上搜索了一下关于 Spring 中设计模式的讲解几乎都是千篇一律,而且大部分都年代久远。所以,花了几天时间自己总结了一下,由于我的个人能力有限,文中如有任何错误各位都可以指出。另外,文章篇幅有限,对于设计模式以及一些源码的解读我只是一笔带过,这篇文章的主要目的是回顾一下 Spring 中的设计模式。 Design Patterns(设计模式) 表示面向对象软件开发中最好的计算机编程实践。 Spring 框架中广泛使用了不同类型的设计模式,下面我们来看看到底有哪些设计模式?