From f3e1ed6873b23062d4ecf248ae1b8db25532fed0 Mon Sep 17 00:00:00 2001 From: wangtong Date: Tue, 29 Mar 2022 14:10:54 +0800 Subject: [PATCH] =?UTF-8?q?[=E4=BF=AE=E6=94=B9]=EF=BC=9A=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=20=E4=BA=8B=E5=8A=A1=E9=9A=94=E7=A6=BB=E7=BA=A7=E5=88=AB(?= =?UTF-8?q?=E5=9B=BE=E6=96=87=E8=AF=A6=E8=A7=A3)=20=E5=85=B3=E4=BA=8E?= =?UTF-8?q?=E5=B9=BB=E8=AF=BB=E7=9A=84=E6=A1=88=E4=BE=8B=E6=BC=94=E7=A4=BA?= =?UTF-8?q?=E5=92=8C=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 --- .../mysql/transaction-isolation-level.md | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/docs/database/mysql/transaction-isolation-level.md b/docs/database/mysql/transaction-isolation-level.md index 2d2930be..35382f0f 100644 --- a/docs/database/mysql/transaction-isolation-level.md +++ b/docs/database/mysql/transaction-isolation-level.md @@ -54,7 +54,7 @@ tag: ---- -| 隔离级别 | 脏读 | 不可重复读 | 幻影读 | +| 隔离级别 | 脏读 | 不可重复读 | 幻读 | | :---: | :---: | :---:| :---: | | READ-UNCOMMITTED | √ | √ | √ | | READ-COMMITTED | × | √ | √ | @@ -127,17 +127,26 @@ 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 的记录这种就是幻读。 幻读和不可重复读有些相似之处 ,但是不可重复读的重点是修改,幻读的重点在于新增或者删除。 +##### 解决幻读的方法 + +解决幻读的方式有很多,但是它们的核心思想就是一个事务在操作某张表数据的时候,另外一个事务不允许新增或者删除这张表中的数据了。解决幻读的方式主要有以下几种: + +1. 将事务隔离级别调整为 `SERIALIZABLE` +2. 在可重复读的事务级别下,给事务操作的这张表添加表锁 +3. 在可重复读的事务级别下,给事务操作的这张表添加 `Next-Key Locks` + +> 说明:`Next-Key Locks` 相当于 行锁 + 间隙锁 + ### 参考 - 《MySQL技术内幕:InnoDB存储引擎》