diff --git a/notes/数据库系统原理.md b/notes/数据库系统原理.md index 151ffc0f..e7ef804b 100644 --- a/notes/数据库系统原理.md +++ b/notes/数据库系统原理.md @@ -383,13 +383,13 @@ MVCC 不能解决幻读的问题,Next-Key Locks 就是为了解决这个问题 ## Record Locks -锁定的对象是记录的索引,而不是记录本身。 +锁定一个记录上的索引,而不是记录本身。 如果表没有设置索引,InnoDB 会自动在主键上创建隐藏的聚集索引,因此 Record Locks 依然可以使用。 ## Gap Locks -锁定一个范围内的索引,例如当一个事务执行以下语句,其它事务就不能在 t.c 中插入 15。 +锁定索引之间的间隙,但是不包含索引本身。例如当一个事务执行以下语句,其它事务就不能在 t.c 中插入 15。 ```sql SELECT c FROM t WHERE c BETWEEN 10 and 20 FOR UPDATE; @@ -397,28 +397,14 @@ SELECT c FROM t WHERE c BETWEEN 10 and 20 FOR UPDATE; ## Next-Key Locks -它是 Record Locks 和 Gap Locks 的结合,不仅锁定一个记录,也锁定范围内的索引。在 user 中有以下记录: +它是 Record Locks 和 Gap Locks 的结合,不仅锁定一个记录上的索引,也锁定范围内的索引。例如一个索引包含以下值:10, 11, 13, and 20,那么就需要锁定以下区间: ```sql -| id | last_name | first_name | age | -|------|-------------|--------------|-------| -| 4 | stark | tony | 21 | -| 1 | tom | hiddleston | 30 | -| 3 | morgan | freeman | 40 | -| 5 | jeff | dean | 50 | -| 2 | donald | trump | 80 | -+------|-------------|--------------|-------+ -``` - -那么就需要锁定以下范围: - -```sql -(-∞, 21] -(21, 30] -(30, 40] -(40, 50] -(50, 80] -(80, ∞) +(negative infinity, 10] +(10, 11] +(11, 13] +(13, 20] +(20, positive infinity) ``` # 七、关系数据库设计理论