From 3a6dca4794bf7381ac116fc8216ef6b88c846288 Mon Sep 17 00:00:00 2001 From: fengzhao Date: Fri, 30 Aug 2024 09:12:54 +0800 Subject: [PATCH] update sql docs --- docs/basic/10.sql-Transaction.md | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/docs/basic/10.sql-Transaction.md b/docs/basic/10.sql-Transaction.md index 4888824b5..8611675ef 100644 --- a/docs/basic/10.sql-Transaction.md +++ b/docs/basic/10.sql-Transaction.md @@ -532,6 +532,25 @@ SELECT ... FOR UPDATE ``` + +## 间隙锁 + +间隙锁(Gap Lock)是InnoDB存储引擎为了实现可重复读隔离级别而引入的一种锁机制。它锁住的是索引记录之间的间隙(而不是索引记录本身),防止其他事务在这个间隙中插入新的数据。 + +为什么需要间隙锁? + +防止幻读: 幻读是指在一个事务中,两次读取同一条数据,却得到了不同的结果。间隙锁通过锁定索引记录之间的间隙,防止其他事务在该间隙中插入新的数据,从而避免幻读的发生。 + + +间隙锁的特性 + +- 锁定范围: 间隙锁锁定的是索引记录之间的间隙,而不是索引记录本身。 +- 锁类型: 间隙锁是排它锁,其他事务不能在锁定的间隙中插入新的数据。 +- 触发条件: 当事务执行范围查询时,InnoDB会自动为符合条件的索引记录之间的间隙加上间隙锁。 +- 锁的释放: 事务提交或回滚时,间隙锁会自动释放。 + + + ## MDL 锁 在 MySQL 使用过程中,不免有对表进行更改的`DDL`操作(alter/drop table)。 @@ -689,6 +708,9 @@ MySQL 5.6 版本引入了 **Online DDL 特性**。 在 MySQL 5.6 之前,执行 DDL 的唯一方法是逐行复制行。INPLACE DDL 主要由 InnoDB 处理,而逐行 COPY 在服务器层处理。 +这种情况,往往需要对整个表加锁,这会导致长时间的阻塞,影响业务的正常运行。 + + 在 MySQL 5.7,Online DDL 在性能和稳定性上不断得到优化,比如通过 bulk load 方式来去除表重建时的 redo 日志等。 到了 MySQL 8.0,Online DDL 已经支持秒级加列特性,该特性来源于国内的腾讯互娱 DBA 团队。 @@ -773,11 +795,11 @@ pt-osc 和 gh-ost 均采用拷表方式实现,即创建个空的新表,通 ALTER TABLE sbtest1 ADD COLUMN k2 int(10) AFTER k,ALGORITHM=INSTANT; ``` -MySQL 8.0.29 开始,ALTER TABLE … ALGORITHM=INSTANT 支持删除某列。 +MySQL 8.0.29 开始,`ALTER TABLE … ALGORITHM=INSTANT` 支持删除某列。 -为了支持 ALTER TABLE … ALGORITHM=INSTANT 的新特性,InnoDB redo log 格式对于所有 DML 操作都发生了变化。 +为了支持 `ALTER TABLE … ALGORITHM=INSTANT` 的新特性,InnoDB redo log 格式对于所有 DML 操作都发生了变化。 -新的 redo 日志格式引入了一个设计缺陷,会导致 instant add/drop columns 的表数据损坏。 +新的 redo 日志格式引入了一个设计缺陷,会导致 `instant add/drop columns` 的表数据损坏。 https://opensource.actionsky.com/20220809-mysql/