`

MySQL innodb 的间隙锁定(next-key locking)

 
阅读更多
MySQL innodb的间隙锁定(next-key locking)是为了防止幻读(phantom read),当MySQL的isolation level设为repeatable read的时候会触发间隙锁定。next-key的具体工作方式为:
1. 选择一个不存在的行,则锁住所有的insert行为
2. 用范围select,如select * from test where id>100,会锁住所有id>100的insert行为

以下是MySQL手册对next-key locking的说明:
15.2.10.6. Next-Key锁定:避免幽灵问题

在行级锁定中,InnoDB 使用一个名为next-key locking的算法。InnoDB以这样一种方式执行行级锁定:当它搜索或扫描表的索引之时,它对遇到的索引记录设置共享或独占锁定。因此,行级锁定事实上是索引记录锁定。

InnoDB对索引记录设置的锁定也映像索引记录之前的“间隙”。如果一个用户对一个索引上的记录R有共享或独占的锁定,另一个用户 不能紧接在R之前以索引的顺序插入一个新索引记录。这个间隙的锁定被执行来防止所谓的“幽灵问题”。假设你想要从有一个标识符值大于100的子表读并锁定所有子记录,并想着随后在选定行中更新一些列:

SELECT * FROM child WHERE id > 100 FOR UPDATE;

假设在id列有一个索引。查询从id大于100的第一个记录开始扫描。如果设置在索引记录上的锁定不把在间隙生成的插入排除在外,一个新行可能与此同时被插进表中。如果你在同一事务内执行同样的SELECT,你可能会在该查询返回的结果包里看到一个新行。这与事务的隔离原则是相反的:一个事务应该能够运行,以便它已经读的数据在事务过程中不改变。如果我们把一套行视为数据项,新的“幽灵”子记录可能会违反这一隔离原则。

当InnoDB扫描一个索引之时,它也锁定所以记录中最后一个记录之后的间隙。刚在前一个例子中发生:InnoDB设置的锁定防止任何插入到id可能大过100的表。

你可以用next-key锁定在你的应用程序上实现一个唯一性检查:如果你以共享模式读数据,并且没有看到你将要插入的行的重复,则你可以安全地插入你的行,并且知道在读过程中对你的行的继承者设置的next-key锁定与此同时阻止任何人对你的行插入一个重复。因此,the next-key锁定允许你锁住在你的表中并不存在的一些东西。
分享到:
评论
1 楼 grzrt 2012-09-07  

相关推荐

    MySQL锁的详细介绍

    * select … from lock in share mode 语句:追加了共享锁,InnoDB 会使用 Next-Key Lock 锁进行处理,如果扫描发现唯一索引,可以降级为 RecordLock 锁。 * select … from for update 语句:追加了排他锁,InnoDB ...

    03-MySQL逻辑架构和Innodb存储引擎1

    5. **Next-Key Locking**:InnoDB为了解决幻读问题,使用Next-Key Locking策略,这涉及到记录锁和间隙锁。 6. **插入缓冲(Insert Buffer)**:用于优化非唯一索引的插入操作。 7. **二次写(Double Write)**:...

    innodb锁

    3. **间隙锁(Gap Locks)与Next-Key Locks**:InnoDB还使用间隙锁来防止插入到已排序索引记录间的空隙,以及防止幻读。Next-Key Lock是记录锁和间隙锁的组合,防止在索引区间内的插入。 4. **死锁(Deadlocks)**...

    2021面试题总结MySQL篇.pdf

    - **Next-Key Locks**:结合记录锁和间隙锁的一种机制,用于防止幻读,是 InnoDB 的默认行级锁定方式。 ### 总结 本文档详细介绍了 MySQL 中关于事务隔离级别、幻读、存储引擎及其特性,以及在高并发场景下如何...

    阿里大牛何sir 深入MySQL加锁处理分析

    - 对于可重复读(RR)隔离级别,InnoDB使用一种称为“next-key lock”的锁定方式,它是一种结合了记录锁(Record Lock)和间隙锁(Gap Lock)的锁,用于防止幻读。 复杂的SQL语句,尤其是涉及多个表的JOIN操作,其...

    MySQL 开发规范

    - **Next-Key Lock(下一个键锁)** - **特点**:同时锁定记录本身及其后的空白区域。 - **示例**:锁定索引10及其后的空白区域。 **4.3 共享锁(S-Lock)与排他锁(X-Lock)** - **共享锁**:允许多个事务读取同一行...

    基于更新SQL语句理解MySQL锁定详解

    6. **Next-Key Locks**:结合了行级锁定和间隙锁定,锁定选定的行及其前后的间隙,进一步防止幻读。 当我们执行更新SQL语句时,MySQL会自动获取写锁。例如,如果我们运行`UPDATE t1 SET n = n + 1 WHERE pad = '...

    mysql锁解决并发问题共7页.pdf.zip

    9. **Next-Key Locks**:是InnoDB存储引擎中的行锁与间隙锁的组合,锁定指定行以及行之间的间隙。 10. **非阻塞锁(Lock-Free)**:通过无锁编程技术,避免锁的使用,提高并发性能,但实现复杂,适用于特定场景。 ...

    浅谈选择mysql存储引擎的标准

    - 默认的可重复读(REPEATABLE READ)隔离级别,通过间隙锁(next-key locking)防止幻读。 - 数据和索引存储在单独的文件中,便于备份、恢复和跨平台迁移。 - 支持热备份,这是其他引擎不具备的特性。 - 主键...

    MySQL数据库事务隔离级别详解

    MySQL的InnoDB存储引擎使用多版本并发控制(MVCC)和间隙锁(next-key locking)策略,在可重复读(Repeatable Read)隔离级别下,可以避免幻读。然而,如果在MyISAM存储引擎下测试,幻读可能依然会发生。此外,如果...

Global site tag (gtag.js) - Google Analytics