- 浏览: 241184 次
文章分类
最新评论
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 929RAID write back指的是raid控制器能够将写 ... -
druid PreparedStatementCache设置
2014-07-08 14:34 3590druid的连接池配置中有PreparedStatement ... -
innodb 插入缓冲
2014-07-01 16:07 685插入缓冲是InnoDB存储引 ... -
Innodb配置,将数据与日志放在不同磁盘可以加快性能
2012-12-06 19:23 735An advanced my.cnf example ... -
character_set_client character_set_connection character_set_results
2012-11-19 20:21 3227之前一直纠结各种编码的却别:character_set_c ... -
amoeba-mysql的安装使用和读写分离(转)
2012-11-16 16:11 1015http://blog.csdn.net/chen861201 ... -
mysqlcheck myisamchk
2012-11-07 17:45 738mysqlcheck的功能类似myisamchk,但其工作不同 ... -
mysqlbinlog乱码
2012-11-06 19:49 5375使用mysqlbinlog查看二进制文件发现 /*!40019 ... -
auto-rehash
2012-11-05 19:20 4115mysql auto-rehash:读取表信息和列信 ... -
MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践
2012-09-19 20:21 764MySQL主从复制(Master-Slave)与读写分离(My ... -
mysql显示见表语句
2012-09-03 19:13 1158show create table mysql.slow_l ... -
mysql主从同步延迟问题
2012-08-30 14:18 839见http://www.ixpub.net/thread-13 ... -
二进制日志文件
2012-08-29 19:33 1100mysqld在每个二进制日志 ... -
备份恢复数据库
2012-08-28 20:18 814全备份 mysqldump -utest -ptest -- ... -
mysql用户修改密码
2012-08-28 19:37 753mysqladmin -utest -ptest passwo ... -
set session sql_log_bin=0
2012-08-21 15:22 3953引自http://blog.sina.com.cn/s/blo ... -
字符串转换成date
2012-08-15 20:00 904SELECT STR_TO_DATE('Tue 05 June ... -
selecting top N records per group
2012-08-15 18:56 895http://code.openark.org/blog/my ... -
MySQL DELAY_KEY_WRITE
2012-08-02 20:03 1125MySQL DELAY_KEY_WRITE 引自http:// ... -
Mysql Merge表的优点
2012-07-09 13:52 932在Mysql数据库中,Mysql Me ...
相关推荐
同时使用一种 -- next-key locking 的锁策略来避免幻读现象的产生,还提供了插入缓冲(insert buffer) 二次写(double write) 自适应哈希索引,预读(read ahead)等高性能和高可用的功能。对于表中的数据innodb...
NULL 博文链接:https://edwin-chen.iteye.com/blog/440645
MySQL InnoDB Java阅读器 innodb-java-reader是一个Java实现,用于直接访问MySQL InnoDB存储引擎文件。 使用库或命令行工具,它提供了只读功能,例如检查页面,通过主键,辅助键查找记录以及通过LSN或填充率生成页面...
MySQL内核 INNODB存储引擎-卷1-高清-完整目录-2014年5月
InnoDB事务-锁-MVCC.pdf
mysql-shell-8.0.18-windows-x86-64bit.zip MySQL Shell is an advanced command-line client and code ... MySQL Shell includes the AdminAPI that enables you to work with InnoDB cluster, see InnoDB Cluster.
2020年1月13日,MySQL官方发布了今年的第一个8.0版本-8.0.19,自2018年4月19日发布第一个稳定版本8.0.11到如今已经历了近两年共9个小版本的迭代,产品稳定性持续增强。极具吸引力的是官方在8.0版本上对MGR bug 的...
MySQL分析 innodb
MySQL技术内幕InnoDB存储引擎-读书笔记.pdf
MySQL Innodb 索引原理详解
mysql 5.6 新特性 innodb
InnoDB 查询优化实现分析 -- MySQL
Innodb-Architecture-Performance-Optimization
mysql innodb类型数据库表 根据ibd文件获取表 space id,用于恢复innodb类型数据表数据
MySql InnoDb还原工具-附件资源
姜承尧老师出版了《MySQL技术内幕:InnoDB存储引擎》、《MySQL内核:InnoDB存储引擎》等Mysql书籍。 课程紧密结合互联网公司实践,学员能够领略到BAT、网易等大公司的数据库架构与应用案例 课纲结合最新的MySQL 5.6...
www.jb51.net next-key 锁定范围:(负无穷大,最小第一记录],(记录之间],(最大记录,正无穷大) 二、语句锁定情况分析 SELECT … FROM … FOR UPDATE对读遇到的所有索引记录设置独占的next-key锁定。 INSERT INTO ...
Record lock单条索引记录上加锁,record lock锁住的永远是索引,而非记录本身,即使该表上没有任何索引,那么innodb会在后台创建一个隐藏的聚集主键索引,那么锁住的就是这个隐藏的聚集主键索引。所以说当一条sql...
Mysql 高可用 InnoDB Cluster 多节点搭建过程
MySQL 社区版是全球广受欢迎的开源数据库的免费下载版本。它遵循 GPL 许可协议,由庞大、活跃的开源开发人员社区提供支持。 MySQL 社区版包括: 可插拔的存储引擎架构 多种存储引擎: InnoDB MyISAM NDB (MySQL ...