- 浏览: 245993 次
-
文章分类
最新评论
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. 选择一个不存在的行,则锁住所有的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锁定允许你锁住在你的表中并不存在的一些东西。
发表评论
-
RAID write back write through
2014-07-09 13:44 958RAID write back指的是raid控制器能够将写 ... -
druid PreparedStatementCache设置
2014-07-08 14:34 3627druid的连接池配置中有PreparedStatement ... -
innodb 插入缓冲
2014-07-01 16:07 708插入缓冲是InnoDB存储引 ... -
Innodb配置,将数据与日志放在不同磁盘可以加快性能
2012-12-06 19:23 753An advanced my.cnf example ... -
character_set_client character_set_connection character_set_results
2012-11-19 20:21 3254之前一直纠结各种编码的却别:character_set_c ... -
amoeba-mysql的安装使用和读写分离(转)
2012-11-16 16:11 1043http://blog.csdn.net/chen861201 ... -
mysqlcheck myisamchk
2012-11-07 17:45 767mysqlcheck的功能类似myisamchk,但其工作不同 ... -
mysqlbinlog乱码
2012-11-06 19:49 5456使用mysqlbinlog查看二进制文件发现 /*!40019 ... -
auto-rehash
2012-11-05 19:20 4146mysql auto-rehash:读取表信息和列信 ... -
MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践
2012-09-19 20:21 780MySQL主从复制(Master-Slave)与读写分离(My ... -
mysql显示见表语句
2012-09-03 19:13 1191show create table mysql.slow_l ... -
mysql主从同步延迟问题
2012-08-30 14:18 864见http://www.ixpub.net/thread-13 ... -
二进制日志文件
2012-08-29 19:33 1162mysqld在每个二进制日志 ... -
备份恢复数据库
2012-08-28 20:18 837全备份 mysqldump -utest -ptest -- ... -
mysql用户修改密码
2012-08-28 19:37 773mysqladmin -utest -ptest passwo ... -
set session sql_log_bin=0
2012-08-21 15:22 4048引自http://blog.sina.com.cn/s/blo ... -
字符串转换成date
2012-08-15 20:00 933SELECT STR_TO_DATE('Tue 05 June ... -
selecting top N records per group
2012-08-15 18:56 925http://code.openark.org/blog/my ... -
MySQL DELAY_KEY_WRITE
2012-08-02 20:03 1144MySQL DELAY_KEY_WRITE 引自http:// ... -
Mysql Merge表的优点
2012-07-09 13:52 963在Mysql数据库中,Mysql Me ...
相关推荐
* select … from lock in share mode 语句:追加了共享锁,InnoDB 会使用 Next-Key Lock 锁进行处理,如果扫描发现唯一索引,可以降级为 RecordLock 锁。 * select … from for update 语句:追加了排他锁,InnoDB ...
5. **Next-Key Locking**:InnoDB为了解决幻读问题,使用Next-Key Locking策略,这涉及到记录锁和间隙锁。 6. **插入缓冲(Insert Buffer)**:用于优化非唯一索引的插入操作。 7. **二次写(Double Write)**:...
3. **间隙锁(Gap Locks)与Next-Key Locks**:InnoDB还使用间隙锁来防止插入到已排序索引记录间的空隙,以及防止幻读。Next-Key Lock是记录锁和间隙锁的组合,防止在索引区间内的插入。 4. **死锁(Deadlocks)**...
- **Next-Key Locks**:结合记录锁和间隙锁的一种机制,用于防止幻读,是 InnoDB 的默认行级锁定方式。 ### 总结 本文档详细介绍了 MySQL 中关于事务隔离级别、幻读、存储引擎及其特性,以及在高并发场景下如何...
- 对于可重复读(RR)隔离级别,InnoDB使用一种称为“next-key lock”的锁定方式,它是一种结合了记录锁(Record Lock)和间隙锁(Gap Lock)的锁,用于防止幻读。 复杂的SQL语句,尤其是涉及多个表的JOIN操作,其...
- **Next-Key Lock(下一个键锁)** - **特点**:同时锁定记录本身及其后的空白区域。 - **示例**:锁定索引10及其后的空白区域。 **4.3 共享锁(S-Lock)与排他锁(X-Lock)** - **共享锁**:允许多个事务读取同一行...
6. **Next-Key Locks**:结合了行级锁定和间隙锁定,锁定选定的行及其前后的间隙,进一步防止幻读。 当我们执行更新SQL语句时,MySQL会自动获取写锁。例如,如果我们运行`UPDATE t1 SET n = n + 1 WHERE pad = '...
9. **Next-Key Locks**:是InnoDB存储引擎中的行锁与间隙锁的组合,锁定指定行以及行之间的间隙。 10. **非阻塞锁(Lock-Free)**:通过无锁编程技术,避免锁的使用,提高并发性能,但实现复杂,适用于特定场景。 ...
- 默认的可重复读(REPEATABLE READ)隔离级别,通过间隙锁(next-key locking)防止幻读。 - 数据和索引存储在单独的文件中,便于备份、恢复和跨平台迁移。 - 支持热备份,这是其他引擎不具备的特性。 - 主键...
MySQL的InnoDB存储引擎使用多版本并发控制(MVCC)和间隙锁(next-key locking)策略,在可重复读(Repeatable Read)隔离级别下,可以避免幻读。然而,如果在MyISAM存储引擎下测试,幻读可能依然会发生。此外,如果...