Skip to content

Commit

Permalink
update sql docs
Browse files Browse the repository at this point in the history
  • Loading branch information
fengzhao committed Aug 30, 2024
1 parent 9f47fb4 commit 3a6dca4
Showing 1 changed file with 25 additions and 3 deletions.
28 changes: 25 additions & 3 deletions docs/basic/10.sql-Transaction.md
Original file line number Diff line number Diff line change
Expand Up @@ -532,6 +532,25 @@ SELECT ... FOR UPDATE
```


## 间隙锁

间隙锁(Gap Lock)是InnoDB存储引擎为了实现可重复读隔离级别而引入的一种锁机制。它锁住的是索引记录之间的间隙(而不是索引记录本身),防止其他事务在这个间隙中插入新的数据。

为什么需要间隙锁?

防止幻读: 幻读是指在一个事务中,两次读取同一条数据,却得到了不同的结果。间隙锁通过锁定索引记录之间的间隙,防止其他事务在该间隙中插入新的数据,从而避免幻读的发生。


间隙锁的特性

- 锁定范围: 间隙锁锁定的是索引记录之间的间隙,而不是索引记录本身。
- 锁类型: 间隙锁是排它锁,其他事务不能在锁定的间隙中插入新的数据。
- 触发条件: 当事务执行范围查询时,InnoDB会自动为符合条件的索引记录之间的间隙加上间隙锁。
- 锁的释放: 事务提交或回滚时,间隙锁会自动释放。



## MDL 锁

在 MySQL 使用过程中,不免有对表进行更改的`DDL`操作(alter/drop table)。
Expand Down Expand Up @@ -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 团队。
Expand Down Expand Up @@ -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/

Expand Down

0 comments on commit 3a6dca4

Please sign in to comment.